C++语言中的细节_1

来源:互联网 发布:全景展示系统源码 编辑:程序博客网 时间:2024/06/05 16:43

//C++ Primer 第12章 笔记

在构造函数的函数体中对类成员进行赋值,而非初始化。

class A{        private:                 string  s;                int  i;        public:              A(){s=NULL;}};


此时,在构造函数的函数体中对类成员s进行的s=NULL是赋值行为,而非初始化行为。


初始化是在初始化列表中进行的,即使初始化列表未给出,也会根据变量类型调用该类型的默认构造函数来初始化。

如   A():s(NULL){}与A(){}是等价的。因为第二个构造函数会调用string类的默认构造函数来初始化s;


但是,const或引用类型数据成员必须通过初始化列表进行初始化。


内置和符合类型的成员(如int类型,此例中的A类,指针和数组),只对定义在全局作用域的对象才初始化。当对象定义在局部作用域中时,内置或复合类型的成员不进行初始化。

如:

int main(){       A a;}    

此时,a.i是没有被初始化的。如果把a.i输出,则会有意想不到的结果。

除了作为赋值的目标之外,以任何方式使用一个未定义的成员都是错误的。如输出上例的a.i。


一个类哪怕之定义了一个构造函数,编译器也不会再生成默认构造函数。


static数据成员必须在类定义体的外部定义。

类的static成员,像普通数据成员一样,不能在类的定义体中初始化。

如下:

class B{        static int  i;   //OK:在类中声明        static int j=1; //ERROR:在类中初始化        int n=1;   //ERROR:在类中初始化};int B::i=1;    //OK:在类定义体的外部定义并初始化



例外:在要初始化式是一个常量表达式,整形const static 数据成员就可以在类的定义体中进行初始化。

注意:const static 数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体外进行定义。但不必要指定初值。

如:

class C{      const static int a=1;};int C::i;