C++初始化列表
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++初始化列表的更多相关文章
- C++中使用初始化列表的情况
http://blog.csdn.net/iceshirley/article/details/5688696 要理解这个问题,从概念上,我们要知道一点,那就是构造函数的执行过程会分成两个阶段:隐式或 ...
- C++11新特性——初始化列表 initializer_list
破事水: 由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮. 然后就去膜了一下C++11的新特性 ...
- 【c++】必须在类初始化列表中初始化的几种情况
转自:http://www.cnblogs.com/kaituorensheng/p/3477630.html 1. 类成员为const类型 2. 类成员为引用类型 #include <iost ...
- C++语法 初始化列表 数组引用
只能在初始化列表initilizationlist中初始化的有: 1.const修饰的数据成员或者reference参考 2.基类的构造函数 注意,数组不能引用,亦即以下代码是不对的 void fun ...
- C++定义构造函数必须使用初始化列表的场合
明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代 ...
- C++-什么时候需要在类的构造函数中使用初始化列表
1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...
- C++:四种必须使用初始化列表情况
[c++]必须在类初始化列表中初始化的几种情况 1. 类成员为const类型 2. 类成员为引用类型 复制代码 #include <iostream> using namesp ...
- C++类构造函数初始化列表
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public: ...
- C++11初始化列表
[C++11之初始化列表] 在C++03中,在严格遵守POD的定义和限制条件的结构及类型上可以使用初始化列表(initializer list),构想是结构或是数组能够依据成员在该结构内定义的顺序通过 ...
随机推荐
- PHPStorm技巧篇 -- 观感优化
(1)设置默认显示行号 (2)设置自动换行 (3)去除代码下划线(拼写检测) 优化说明:自动换行和显示行号字面意思很好理解,下划线说明一下,phpstorm默认对代码进行拼写校验,即对于不符合英文单词 ...
- SAP 采购订单收货时报错:对于采购订单xxxx无收货可能
因为这个问题查了挺长时间,所以写在博客里记录下. 报错详细: 每个公司的配置不同,我公司遇到的这个问题原因是这里的确认控制是从信息记录带过来的,问题解决方法是,修改下确认控制的选项: 修改确认控制的后 ...
- OneProxy添加license
proxy-license=XXXX-XXXX-XXXX-XXXX 放到proxy.conf中,然后重启proxy
- Android之Activity状态的保存和恢复
系统在某些情况下会调用onSaveInstanceState()和onRestoreInstanceState() 这两个方法来保存和恢复Activity的状态. 一句话:Activity在" ...
- 前端MV*框架的意义
经常有人质疑,在前端搞MV*有什么意义?也有人提出这样的疑问:以AngularJS,Knockout,BackBone为代表的MV*框架,它跟jQuery这样的框架有什么区别?我jQuery用得好好的 ...
- ON DUPLICATE KEY UPDATE重复插入时更新
mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...
- 卸载mysql
如果你的电脑里装过MySQL,想再重新安装MySQL的时候可能就会因为前一版本卸载不彻底而出现错误.最常见的就是安装好后设置参数的最后一步验证时,会在Execute configurattion步骤中 ...
- Android 常用布局视图
常用包 http://square.github.io/ EventBus Scroller 滚动 拖拽 # android.support.design.widget.CollapsingToolb ...
- 记一次使用jQuery清空元素
缘由: 数据量比较大,分页显示,页码是自己写的,动态创建页码,创建元素时会绑定元素的click事件,每次显示五个页码(1,2,3,4,5),点击2—4不换,点5,页码变成3,4,5,6,7. 遇到的问 ...
- Javascript理解this对象
this是函数运行时自动生成的一个内部对象,只能在函数内部使用,但总指向调用它的对象. 通过以下几个例子加深对this的理解. (1)作为函数调用 var name = 'Jenny'; functi ...