构造函数之显式初始化与赋值

  大部分程序员写构造函数时是这样的:

class ClassA
{
    ClassA();
    ......
};

ClassA::ClassA()
{
    A=1;
    B=2;
    ......
}

  这一类构造函数包括了初始化和赋值两个步骤,在执行构造函数函数体内语句前,已经隐式调用了默认构造函数对变量进行初始化,函数体内语句其实是进行了一次赋值。
  更规范的是使用初始化列表进行初始化,即显式初始化

ClassA::ClassA():A(1),B(2) 
{ 

}

  使用默认构造函数时,初始化成员的规则与初始化变量规则相同,即具有类类型的成员使用默认各自的默认构造函数来初始化,内置和复合类型的全局变量初始化为0,内置和复合类型的局部作用域的变量则不初始化。
  故而使用显示初始化是有好处的。第一是效率问题,因为要额外赋值一次,在函数体内赋值效率相对较低,当然如果你不在乎这一点点效率,我们还有第二条;第二条如果没有在函数体内给类成员提供初始化式,编译器会使用成员类型的默认构造函数;如果那个类没有默认构造函数,则初始化失败。另外const或引用类型的成员,无法赋值,只能在初始化列表中初始化。譬如:

class ClassA
{
private:
    int i;
    const int j;
    int &k;
public:
    ClassA(int B);
    ......
};

ClassA::ClassA(int B)
{
    i=B;    //ok
    j=B;    //error,不能给const对象赋值
    k=i;    //error,k没有初始化绑定一个对象
    ......
}

  正确初始化方式为

ClassA::ClassA(int B):i(B),j(B),k(i)
{

}

  以上参考自《c++primer》


http://www.niftyadmin.cn/n/866268.html

相关文章

爬虫:对网站加密请求的分析

爬虫:对网站加密请求的分析 引语: 最近因为有一些需求,需要对某些网站的数据进行抓取然后分析用户的行为之类的.所以对遇到的一些问题进行一个记录,第一次处理这种加密的请求, 也花费了自己不少时间,做一个处理过程的记录.给有类似需求的朋友也增加一个可参考的资料. 分析步…

开放定址法实现散列表

使用分离链接法实现散列表时需要额外的空间来存储指针,而且需要给新单元动态分配空间,导致算法的速度减慢。开放定址法一次分配表的大小,可以使用线性散列,平方散列,双重散列等等方法,这些方法除了散列函数…

服务器CLOSE_WAIT请求太多的问题

上周因为调用某个服务不可用,导致服务器出现了大量的CLOSE_WAIT的tcp链接,导致tomcat出现了假死的情况.大量的tcp请求一直卡着,其他请求进来tomcat已经不能提供服务了. 头一次遇到这样的情况,然后查了一下这个CLOSE_WAIT的资料.发现CLOSE_WAIT其实是tcp的一种状态,我们先来看张…

分离链接法实现散列表

散列表是一种用于查找的数据结构。其基本思想来自于索引,也可以看成是数组的一种扩展。对于一些数据信息,比如说图片文件名,如果我们要查找某张图片,通常将图片名作为关键字进行搜索。这个时候是不可能把图片名直接当成数组下标的…

C++ Basic 19: 基本输入输出流

目录 C 基本的输入输出 I/O 库头文件 标准输出流(cout) 标准输入流(cin) 标准错误流(cerr) 标准日志流(clog) C 基本的输入输出 C 标准库提供了一组丰富的输入/输出功能&#…

mfc中如何使用全局变量进行数据共享

文章转载自http://www.programfan.com/article/2894.html 用MFC制作的工程由很多文件构成,它不能象一般C程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现&#…

怎样将discuz所有页面的Powered by Discuz!去掉

百度出来的方法可以去掉门户、论坛首页的Powered by Discuz!,但是版面、发帖时依旧出现。 如果使用linux系统,可以切换到网站根目录下,我的是centos7系统,切换到/var/www下,即 cd /var/www 再查找目录下…

DevExpress数据源SqlDataSource使用

DevExpress对数据源进行了重新封装产生了只读数据源SqlDataSource,相较于传统的ADO.NET更易于使用。 SqlDataSource组件旨在创建和配置数据库以访问WinForms应用程序中的各种数据感知控件。使用它来提供对DevExpress.XtraGrid.GridControl,DevExpress.X…