C++初始化列表

定义一个类对象时,常常使用初始化列表实例化一个对象,在进入构造函数函数体之前对成员变量完成初始化操作。普通成员变量既可以在初始化中初始化,也可以在函数体重赋值;const成员变量只能在初始化列表中赋值。下面对初始化列表进行一个简单介绍:

  • 使用初始化列表
 #include <iostream>

 using namespace std;

 class InitTest{
public:
InitTest(int x,int y,int z) : a(x),b(y),c(z){}
public:
void Print() const{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
private:
int a;
int b;
int c;
}; int main(int argc, char** argv)
{
InitTest test(,,);
test.Print(); return ;
}

成员变量被正确赋值,输出:

  • 初始化列表必须使用场景1——const成员变量
 class InitTest{
public:
InitTest(int x,int y,int z){ a = x; // error C2758: “InitTest::a”: 必须在构造函数基/成员初始值设定项列表中初始化
b = y;
c = z;
}
private:
const int a;
int b;
int c;
};
 class InitTest{
public:
InitTest(int x,int y,int z) : a(x){ // OK
b = y;
c = z;
}
public:
void Print() const{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
private:
const int a;
int b;
int c;
};
  • 初始化列表必须使用场景2——成员变量或基类未声明默认构造函数

成员变量未声明默认构造函数

 #include <iostream>

 using namespace std;

 class InitTest{
public:
InitTest(int x,int y,int z) : a(x),b(y),c(z){}
public:
void Print() const{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
private:
int a;
int b;
int c;
}; class HaveInitTest{
InitTest test1;
public:
HaveInitTest(){}
}; int main(int argc, char** argv)
{
HaveInitTest havetest; // error C2512: “InitTest”: 没有合适的默认构造函数可用 return ;
}
 #include <iostream>

 using namespace std;

 class InitTest{
public:
InitTest(int x,int y,int z) : a(x),b(y),c(z){}
public:
void Print() const{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
private:
int a;
int b;
int c;
}; class HaveInitTest{
InitTest test1;
public:
HaveInitTest() : test1(,,){}
}; int main(int argc, char** argv)
{
HaveInitTest havetest; // OK return ;
}

基类未声明默认构造函数

 #include <iostream>

 using namespace std;

 class InitTest{
public:
InitTest(int x,int y,int z) : a(x),b(y),c(z){}
private:
int a;
int b;
int c;
}; class DerivedFromInitTest : public InitTest{
public:
DerivedFromInitTest(){}
}; int main(int argc, char** argv)
{
DerivedFromInitTest dervetest; // error C2512: “InitTest”: 没有合适的默认构造函数可用 return ;
}
 #include <iostream>

 using namespace std;

 class InitTest{
public:
InitTest(int x,int y,int z) : a(x),b(y),c(z){}
private:
int a;
int b;
int c;
}; class DerivedFromInitTest: public InitTest{
public:
DerivedFromInitTest() : InitTest(,,){}
}; int main(int argc, char** argv)
{
DerivedFromInitTest derivetest; // OK return ;
}

最简单的解决方法是将InitTest的构造函数声明为:InitTest(int x = 0,int y = 0,int z = 0)。

  • 初始化列表必须使用场景3——声明为引用类型的成员变量
 #include <iostream>

 using namespace std;

 class InitTest{
public:
InitTest(int &x, int y, int z){
a = x; // error C2758: “InitTest::a”: 必须在构造函数基/成员初始值设定项列表中初始化
b = y;
c = z;
}
private:
int &a;
int b;
int c;
};
 class InitTest{
public:
InitTest(int &x, int y, int z) : a(x){ // OK
b = y;
c = z;
}
private:
int &a;
int b;
int c;
};

数据成员初始化顺序

数据成员按照他们在类中的声明顺序来初始化,而不是按照在初始化列表中出现的顺序。

 #include <iostream>

 using namespace std;

 class InitTest{
public:
InitTest(const int a, const int b) : x(a),y(b){}
private:
int x;
int y;
}; int main(int argc, char** argv)
{
InitTest test(,); // test.x = 10, test.y = 20 return ;
}
 #include <iostream>

 using namespace std;

 class InitTest{
public:
InitTest(const int a, const int b) : y(b),x(a + y){}
private:
int x;
int y;
}; int main(int argc, char** argv)
{
InitTest test(,); // test.x未初始化, test.y = 20 return ;
}

!总结:初始化列表中,先声明数据不依赖后声明数据来初始化。

C++初始化列表的更多相关文章

  1. C++中使用初始化列表的情况

    http://blog.csdn.net/iceshirley/article/details/5688696 要理解这个问题,从概念上,我们要知道一点,那就是构造函数的执行过程会分成两个阶段:隐式或 ...

  2. C++11新特性——初始化列表 initializer_list

    破事水: 由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮. 然后就去膜了一下C++11的新特性 ...

  3. 【c++】必须在类初始化列表中初始化的几种情况

    转自:http://www.cnblogs.com/kaituorensheng/p/3477630.html 1. 类成员为const类型 2. 类成员为引用类型 #include <iost ...

  4. C++语法 初始化列表 数组引用

    只能在初始化列表initilizationlist中初始化的有: 1.const修饰的数据成员或者reference参考 2.基类的构造函数 注意,数组不能引用,亦即以下代码是不对的 void fun ...

  5. C++定义构造函数必须使用初始化列表的场合

    明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代 ...

  6. C++-什么时候需要在类的构造函数中使用初始化列表

    1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...

  7. C++:四种必须使用初始化列表情况

    [c++]必须在类初始化列表中初始化的几种情况   1. 类成员为const类型   2. 类成员为引用类型   复制代码 #include <iostream> using namesp ...

  8. C++类构造函数初始化列表

    C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public:     ...

  9. C++11初始化列表

    [C++11之初始化列表] 在C++03中,在严格遵守POD的定义和限制条件的结构及类型上可以使用初始化列表(initializer list),构想是结构或是数组能够依据成员在该结构内定义的顺序通过 ...

随机推荐

  1. mysql mybatis-generator plugin 分页

    generator.xml配置如下: plugin必须紧跟context,否则会报错 <?xml version="1.0" encoding="UTF-8&quo ...

  2. Oracle Deadlock / 死锁 处理

    Get the directory of alert log sqlplus / as sysdba show parameters udmp SQL> show parameters dump ...

  3. 如何查看python 的api

    python 搭建好python开发环境后,怎么查看api文档呢? 其实很简单: 首先打开命令行,在dos窗口输入: python -m pydoc -p 4895 python -m pydoc - ...

  4. AX2012 QTY小数的位数问题

    小数的位数 ============================================ A.扩展数据类型Qty的位数(默认为2位)B.单位中的位数(通常PCS为0位)C.扩展数据类型Bo ...

  5. 磁盘文件系统Fat、Fat32、NTFS、exFAT的优缺点

    我们在Windows系统里格式化磁盘的时候,文件系统的选项里可以看到有“FAT”.“FAT32”.“NTFS”等选项,在对U盘或其他移动存储设备 格式化的时候还会出现“exFAT”选项,那么这四种磁盘 ...

  6. 浏览器地址栏背后的logic

    曾经有面试题是这样的:"描述在浏览器的地址栏中输入:http://www.baidu.com 后发生了什么?". 1.服务端返回baidu页面资源,浏览器载入html 2.浏览器开 ...

  7. 解决Strokeit在win8下的图标问题和开机启动问题

    Strokeit目前和Windows 8有一点不兼容,就是运行之后,任务栏会有它的图标,看着很不爽,用兼容模式运行可解决这个问题,但是这样一来就不能开机自动运行了,本文主要解决这个问题.  (参考资料 ...

  8. PSP记录个人项目耗时情况

    四则运算编程 PSP记录个人项目耗时情况 PSP Personal Software Process Stages Time(%) Planning 计划 7 Estimate 估计这个任务需要多少时 ...

  9. 非对称加密算法-RSA

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...

  10. MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

    逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. ...