C++编程思想学习——名字控制
2012-04-09 20:09
316 查看
1、 静态元素
静态变量:静态变量存储于固定地址,而非栈式分配,在调用时,只有第一次调用才进
行初始化。
静态对象:同静态变量一致同样需要初始化操作。但是,编译器自动赋值(也称零赋值
只对内部类型有效,而对于用户自定义类型必须用构造函数来初始化。静态对象的构造函数在进入main函数体前执行。静态对象的析构函数会在main函数退出后执行。所以,利用这一点在main函数之前和之后执行一定的代码。
2、 名字空间
创建一个名字空间与创建一个类类似,但是,可以像重定义一个类一样,在多个文件中
用同一个标识符来定义一个同一个命名空间。
同样有时为了方便可以用namespace关键来给一个名字起一个别名。
3、 koenig也称ADL,即参数相关查找
如果一个函数使用了一个命名空间的成员。那么在调用函数时,对该函数的查找范围会将这个成员所在的命名空间也包括进去。
4、 未命名的名字空间
每个翻译单元都可包含一个未命名的名字空间,但每个翻译单元只可以有一个未命名的
名字空间。在这个空间中的名字自动地在本翻译单元无限制地有效。
可以通过三种方式来使用命名空间中的成员:1)、用作用域的方式 2)、用using namespace一次性的将一个命名空间中的所有成员都引入到当前翻译单元。3)、用using声明引用名字某一个指定的成员。
Using
引入的成员的作用域的范围为使用using指令时位置的作用域的范围与命名空间的名字以及在哪里定义没有关系。
5、 C++中的静态成员
类的静态成员:为类的所有对象共同拥有的一个单一的固定存储空间。所以,存储空间
的定义必须是在一个单独的地方,而不是在类的内部,也只能是在类的外部的实现的地方。
类的静态数组:静态数组有常量和非常量两种。除整型静态常量成员可以在类中初始化外浮点型静态常量成员以及所有的静态数组以及静态常量数组都必须在类的外部进行初始化。
静态常量对象:可以在类中创建静态常量对象以及这样的对象的数组。不过不能在本类中用内联的形式初始化这些静态常量对象以及这样的对象的数组。而必须要在类的外部对这样的对象以及对象数组进行初始化。
6、 嵌套类以及局部类中的静态成员
可以在一个嵌套类(类中类)中定义一个静态成员变量。但是,却不能将一个静态成员
放到一个局部类中(定义在函数中的类),因为,没办法对类中的静态成员进行外部的初始化,外部没办法找到函数中的类中的静态成员。
7、 静态成员函数
类的静态成员函数是与类关联而不是与类中的对相关联。所以,调用静态成员函数时,
并不传递this指针。没有this指针,静态成员函数当然就不能访问类的其他的非静态的成员以及非静态的成员函数,而只能访问类中的静态类型的成员以及静态的成员函数。
8、 静态初始化的依赖性
在指定的翻译单元中静态对象严格按照定义的顺序执行初始化。但是,如果一个静态
对象的作用域为多个文件则问题出现了。本对象的初始化究竟按照那一个文件的顺序来,或者这个静态变量的初始化与另外的一个变量的值有关系,或者有两个静态变量的初始化相互关联问题就更微妙了,这样这些静态变量的初始值就可能直接与这些相互关联的静态变量的初始化话的顺序相关,初始化的顺序不同很可能引起初始值不同。
所以,最好不要用让静态变量发生依赖,或者将所有的静态变量的定义放在同一个文件中。或者用下面的两种技术:
技术一:
在库文件中加上一个额外的类。这个类负责库中的静态对象的动态初始化。这样当本库的头文件在包含它的第一个编译单元内被初始化,其余的单元都会被通过#ifndefine的预处理操作所忽略。
技术二:
它基于这样的一个思想:函数在被调用的时候,函数内的成员对象将被初始化,而在另外的任何时刻是不会进行初始化操作的。这样就我们可以将所要定义的静态对象的定义放到一个会返回该类对象的引用的函数中。这样我们可以通过控制什么时候调用什么函数来决定什么时间定义去那一个类的对象同时进行该对象的初始化。
9、 替代连接说明
当在写程序需要调用一个C库中的函数。但是,由于C++编译器为实现函数的重载对于
函数在内部的表示进行了与C不一样的表示(多加了一些后缀)。这样经过编译器的翻译后。连接器将无法解释C库的函数。就没办法使用C库中的函数。为了能够使用C库中的函数。C++编译器对extern关键字进行了重载。用extern后跟一个表示C或则C++库的字符串来指定所要连接的函数的连接类型为C还是C++;
本文为个人学习C++编程思想时个人心得体会,所以,难免有不严谨之处,甚至有可能是错误的理解。如发现错误,或者疑问。欢迎提出讨论,共同学习、进步。
静态变量:静态变量存储于固定地址,而非栈式分配,在调用时,只有第一次调用才进
行初始化。
静态对象:同静态变量一致同样需要初始化操作。但是,编译器自动赋值(也称零赋值
只对内部类型有效,而对于用户自定义类型必须用构造函数来初始化。静态对象的构造函数在进入main函数体前执行。静态对象的析构函数会在main函数退出后执行。所以,利用这一点在main函数之前和之后执行一定的代码。
2、 名字空间
创建一个名字空间与创建一个类类似,但是,可以像重定义一个类一样,在多个文件中
用同一个标识符来定义一个同一个命名空间。
同样有时为了方便可以用namespace关键来给一个名字起一个别名。
3、 koenig也称ADL,即参数相关查找
如果一个函数使用了一个命名空间的成员。那么在调用函数时,对该函数的查找范围会将这个成员所在的命名空间也包括进去。
4、 未命名的名字空间
每个翻译单元都可包含一个未命名的名字空间,但每个翻译单元只可以有一个未命名的
名字空间。在这个空间中的名字自动地在本翻译单元无限制地有效。
可以通过三种方式来使用命名空间中的成员:1)、用作用域的方式 2)、用using namespace一次性的将一个命名空间中的所有成员都引入到当前翻译单元。3)、用using声明引用名字某一个指定的成员。
Using
引入的成员的作用域的范围为使用using指令时位置的作用域的范围与命名空间的名字以及在哪里定义没有关系。
5、 C++中的静态成员
类的静态成员:为类的所有对象共同拥有的一个单一的固定存储空间。所以,存储空间
的定义必须是在一个单独的地方,而不是在类的内部,也只能是在类的外部的实现的地方。
类的静态数组:静态数组有常量和非常量两种。除整型静态常量成员可以在类中初始化外浮点型静态常量成员以及所有的静态数组以及静态常量数组都必须在类的外部进行初始化。
静态常量对象:可以在类中创建静态常量对象以及这样的对象的数组。不过不能在本类中用内联的形式初始化这些静态常量对象以及这样的对象的数组。而必须要在类的外部对这样的对象以及对象数组进行初始化。
6、 嵌套类以及局部类中的静态成员
可以在一个嵌套类(类中类)中定义一个静态成员变量。但是,却不能将一个静态成员
放到一个局部类中(定义在函数中的类),因为,没办法对类中的静态成员进行外部的初始化,外部没办法找到函数中的类中的静态成员。
7、 静态成员函数
类的静态成员函数是与类关联而不是与类中的对相关联。所以,调用静态成员函数时,
并不传递this指针。没有this指针,静态成员函数当然就不能访问类的其他的非静态的成员以及非静态的成员函数,而只能访问类中的静态类型的成员以及静态的成员函数。
8、 静态初始化的依赖性
在指定的翻译单元中静态对象严格按照定义的顺序执行初始化。但是,如果一个静态
对象的作用域为多个文件则问题出现了。本对象的初始化究竟按照那一个文件的顺序来,或者这个静态变量的初始化与另外的一个变量的值有关系,或者有两个静态变量的初始化相互关联问题就更微妙了,这样这些静态变量的初始值就可能直接与这些相互关联的静态变量的初始化话的顺序相关,初始化的顺序不同很可能引起初始值不同。
所以,最好不要用让静态变量发生依赖,或者将所有的静态变量的定义放在同一个文件中。或者用下面的两种技术:
技术一:
在库文件中加上一个额外的类。这个类负责库中的静态对象的动态初始化。这样当本库的头文件在包含它的第一个编译单元内被初始化,其余的单元都会被通过#ifndefine的预处理操作所忽略。
技术二:
它基于这样的一个思想:函数在被调用的时候,函数内的成员对象将被初始化,而在另外的任何时刻是不会进行初始化操作的。这样就我们可以将所要定义的静态对象的定义放到一个会返回该类对象的引用的函数中。这样我们可以通过控制什么时候调用什么函数来决定什么时间定义去那一个类的对象同时进行该对象的初始化。
9、 替代连接说明
当在写程序需要调用一个C库中的函数。但是,由于C++编译器为实现函数的重载对于
函数在内部的表示进行了与C不一样的表示(多加了一些后缀)。这样经过编译器的翻译后。连接器将无法解释C库的函数。就没办法使用C库中的函数。为了能够使用C库中的函数。C++编译器对extern关键字进行了重载。用extern后跟一个表示C或则C++库的字符串来指定所要连接的函数的连接类型为C还是C++;
本文为个人学习C++编程思想时个人心得体会,所以,难免有不严谨之处,甚至有可能是错误的理解。如发现错误,或者疑问。欢迎提出讨论,共同学习、进步。
相关文章推荐
- java 编程思想的学习笔记 - 第三章 操作符 第四章 控制执行
- java编程思想 第四章 控制执行流程学习心得
- 【java编程思想--学习笔记(三)】访问控制-接口实现与类的访问权限
- 【Java编程思想--学习笔记(一)】访问控制-包
- Java 编程思想(第四版)学习笔记(6)访问权限控制
- C++编程思想学习——运算符重载
- Java编程思想——第六章 访问权限控制 学习总结
- [学习笔记][Java编程思想]第6章:访问权限控制
- 《C++ 编程思想》的学习
- Java 编程思想(第四版)学习笔记(4 )控制执行流程
- C++学习笔记――名字控制
- Thinking In C++ 学习笔记(2)名字控制
- C++ 编程思想——命名控制
- [Java编程思想-学习笔记]第4章 控制执行流程
- 【java编程思想--学习笔记(二)】访问控制-Java访问权限修饰词
- Java编程思想学习笔记六:访问权限控制
- 关于学习c++和编程的50个观点
- Java编程思想 学习计划
- Matlab C/C++混合编程实例学习
- 学习C++和编程的50个观点(转)