c++成员初始化列表
来源:互联网 发布:索尼dpt s1 淘宝 编辑:程序博客网 时间:2024/06/06 07:28
C++为类中提供类成员的初始化列表
类对象的构造顺序是这样的:
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
2.进入构造函数后在构造函数中执行一般计算
使用初始化列表有两个原因:
1.必须这样做:
...{
public:
private:
};
class MyClass
...{
public:
private:
};
2.效率要求这样做:
注意:构造函数需要初始化的数据成员,不论是否显示的出现在构造函数的成员初始化列表中,都会在该处完成初始化,并且初始化的顺序和其在声明时的顺序是一致的,与列表的先后顺序无关,所以要特别注意,保证两者顺序一致才能真正保证其效率。
为了说明清楚,假设有这样一个类:
class foo{
};
1、foo(){}和foo(int i = 0){}都被认为是默认构造函数,因为后者是默认参数。两者不能同时出现。
2、构造函数列表的初始化方式不是按照列表的的顺序,而是按照变量声明的顺序。比如foo里面,a在b之前,那么会先构造a再构造b。所以无论 foo():a(b + 1), b(2){}还是foo():b(2),a(b+1){}都不会让a得到期望的值。如果先声明b再声明a则会更好。
3、构造函数列表能够对const成员初始化。比如foo里面有一个int const c;则foo(int x) : c(x){}可以让c值赋成x。不过需要注意的是,c必须在每个构造函数(如果有多个)都有值。
4、在继承里面,只有初始化列表可以构造父类的private成员。比如说
class child : public foo{
}
foo里面的构造函数是这样写的:foo (int x) { a = x; }.
而在child里面写child(int x){ foo(x); }是通过不了编译的。只有把父类初始化改为foo(int x) : a(x){}而子类构造写作child (int x) : foo(x){}才可以。
另一篇关于初始化列表的文章:
- 我们知道普通变量编译器都会默认的替你初始化。他们既能初始化,也能被赋值的,而常量(const)按照其意思只能被初始化,不能赋值。否则与变量就无区别了。所以常量成员(const member)只能用成员初始化列表来完成他们的“初始化”,而不能在构造函数内为他们“赋值”。
- 我们知道类的对象的初始化其实就是调用他的构造函数完成,如果没有写构造函数,编译器会为你默认生成一个。如果你自定义了带参数的构造函数,那么编译器将不生成默认构造函数。这样这个类的对象的初始化必须有参数。如果这样的类的对象来做另外某个类的成员,那么为了初始化这个成员,你必须为这个类的对象的构造函数传递一个参数。同样,如果你在包含它的这个类的构造函数里用“=”,其实是为这个对象“赋值”而非“初始化”它。所以一个类里的所有构造函数都是有参数的,那么这样的类如果做为别的类的成员变量,你必须显式的初始化它,你也是只能通过成员初始化列表来完成初始化。例如:
class B
{
......
}
class A
{
public:
B member_b;
A();
}
A::A():B(...) //你必须显式初始化它,因为他的所有构造函数
B=...; //因为如上所写,已经初始化了,才能被赋值,否则错误。
}
——————————————————————————————————————
初始化顺序:
{
{
}
};
黄色的既是初始化列表,他们会在构造函数正式调用前被调用,且他们的初始化顺序并不是根据 初始化列表中出现的顺序,而是他们声明的顺序来初始化。如上:
初始化顺序是:a, str, o;
一般用于初始化 常量类型,静态类型的数据,或者不能独立存在的数据
- c++——成员初始化列表
- 成员初始化列表
- C++成员初始化列表
- 成员初始化列表
- C++ 成员初始化列表
- C++成员初始化列表
- 成员初始化列表
- C++成员初始化列表
- 成员初始化列表
- C++成员初始化列表
- c++初始化成员列表
- 初始化成员列表
- C++初始化成员列表
- C++ 成员初始化列表
- C++初始化成员列表
- 成员初始化列表
- C++成员初始化列表
- C++初始化成员列表
- storyboard中创建按钮点击时去掉高亮状态
- mysql查询今天,昨天,近7天,近30天,本月,上一月数据方法
- 火车票
- 彻底学会使用epoll(三)——ET的读操作实例分析
- linux ps 命令查看进程状态
- c++成员初始化列表
- 安装Microsoft Windows SDK 7.1时出现的错误
- unity5.0安卓开发环境配置
- Android studio gradle配置
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
- How to use isInEditMode() to see layout with custom View in the editor
- LINUX 常用命令笔记
- hdu 1385 spfa和floyd,dijkstra记录最短最小字典序的路径
- TIME_WAIT状态引起的服务端重启失败问题