c++ 初始化列表
所属分类 c
浏览量 832
构造函数除了有名字,参数列表和函数体之外,
还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段
C++中,struct和class的唯一区别是默认的访问性不同
struct foo
{
string name ;
int id ;
// 初始化列表
foo(string s, int i):name(s), id(i){} ;
};
注意点
成员的初始化顺序与声明顺序相同
成员的初始化顺序与初始化列表中的位置无关
初始化列表先于构造函数的函数体执行
初始化与赋值区别
初始化 对正在创建的对象进行初始值设置
赋值 对已经存在的对象进行值设置
对于类类型来说,使用初始化列表少了一次调用默认构造函数的过程 ,性能更好
必须使用初始化列表的场景
常量成员,常量只能初始化不能赋值
引用类型,引用必须在定义的时候初始化,并且不能重新赋值
没有默认构造函数的类类型,使用初始化列表可以不调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化
#include "iostream"
struct A{
int value = 1;
// 无参构造函数
A(){std::cout << "A() run" << std::endl;}
// 拷贝构造函数
A(const A& a){
std::cout << "Copy constructor for A run" << std::endl;
this -> value = a.value;
}
// 赋值运算符
A& operator = (const A& a)
{
std::cout << "assignment for A run" << std::endl ;
this->value = a.value ;
return *this;
}
};
struct B{
A a ;
B(A &a){
this->a = a ;
}
B(A &a,int flag):a(a){}
};
int main(){
A a;
std::cout << "------" << std::endl ;
B b(a);
std::cout << "------" << std::endl ;
// 列表初始化 , 不调用默认构造函数 ,直接调用拷贝构造函数
B b2{a,1};
return 0;
}
A() run
------
A() run
assignment for A run
------
Copy constructor for A run
上一篇
下一篇
c++ 面向对象 例子
C++11 智能指针
C++类成员初始化
C++ 花括号和括号初始化的区别
C++面向对象知识点
c++构造函数