C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域

2024-03-28 08:38

本文主要是介绍C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 命名空间内部名字的查找规则

由内向外依次查找每个外层作用域。

  • 外层作用域也可能是一个或多个嵌套的命名空间, 直到最外层的全局命名空间查找过程终止。

  • 只有位于开放的块中且在使用点之前声明的名字才被考虑

 namespace A {int i;namespace B {int i;        // hides A::i within Bint j;int f1(){int j;    // j is local to f1 and hides A::B::jreturn i; // returns B::i}} // namespace B is closed and names in it are no longer visibleint f2() {return j;     // error: j is not defined}int j = i;      // initialized from A::i}

1.1 命名空间中的类的查找规则

当成员函数使用某个名字时, 首先在该成员中进行查找, 然后在类中查找( 包括基类), 接着在外层作用域中查找,这时一个或几个外层作用域可能就是命名空间

namespace A {int i;int k;class C1 {public:C1(): i(0), j(0) { }   // ok: initializes C1::i and C1::jint f1(){return k;        // returns A::k}int f2(){return h;        // error: h is not defined}int f3();private:int i;                // hides A::i within C1int j;};int h = i;               // initialized from A::i
}
// member f3 is defined outside class C1 and outside namespace A
int A::C1::f3()
{return h;               // ok: returns A::h
}

2. 实参相关的查找与类类型形参

隐藏规则:直接访问输出运算符。

当我们给函数传递一个类类型的对象时, 除了在常规的作用域查找外,还会查找实参类所属的命名空间。 这一例外对于传递类的引用或指针的调用同样有效

eg.

std::string s;
std::cin » s;operator>> (std::cin, s);

或者使用函数调用的形式以把命名空间的信息包含进来:

std::operator»(std::cin, s) ; / / 正确: 显式地使用 std::>>

2.1 查找与 std::move 和 std::forward

如果在应用程序中定义了一个标准库中已有的名字, 则将出现以下两种情况中的一种:

  • 根据一般的重载规则确定某次调用应该执行函数的哪个版本
  • 应用程序根本就不会执行函数的标准库版本

2.2 友元声明与实参相关的查找

namespace A {class C {// 两个友元, 在友元声明之外没有其他的声明// 这些函数隐式地成为命名空间 A 的成员// 除非另有声明, 否则不会被找到friend void f(const C& ); // 才艮据实参相关的查找规贝可以被找到friend void f2();}
}

当类声明了一个友元时, 该友元声明并没有使得友元本身可见

一个另外的未声明的类或函数如果第一次出现在友元声明中, 则我们认为它是最近的外层命名空间的成员

int main ( )
{A::C cobj;f(cobj);f2();//正确: 通过在 A::C 中的友元声明找到 A::f//错误: A::f 2 没有被声明
}

这篇关于C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855074

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规