首页  

c++ 初始化列表     所属分类 c 浏览量 68
构造函数除了有名字,参数列表和函数体之外,
还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段

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++构造函数