关闭

C++语言中的细节_1

235人阅读 评论(0) 收藏 举报
分类:

//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;


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2229次
    • 积分:99
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档