c++构造函数中初始化列表的作用和机制
来源:互联网 发布:window7连接网络打印机 编辑:程序博客网 时间:2024/06/14 04:41
c++中构造函数有初始化列表,目的是用于变量的初始化。
百度初始化列表会告诉你初始化列表能够提高构造函数的性能,在派生类中可以跳过基类构造函数,直接进行赋值操作。下面是一常见派生类中使用初始化列表的例子。
class A{public:A(int i = 0):a(i){} //基类初始化成员变量protected:int a;};class B :public A{public:B():a(5){}//派生类不能初始化基类成员变量};
这样是正确的:
#include<iostream>usingnamespace std;class A{protected:int a;public:A(int i = 0):a(i) {}};class B :public A{public:B():A(5){}//基类的成员函数void printinfo(){cout<< a<< endl;}};也可以这样:
#include<iostream>usingnamespace std;class A{public:A(int i = 0):a(i) {}protected:int a;};class B :publicA{public: B() {a=5;}};
其中为什么要使用初始化列表是因为:
1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面;
2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面;
3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。
另外一个重点问题是:成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的。
#include <iostream>#include <string>using namespace std;class base{private:int m_i;int m_j;public:base(int i): m_j(i), m_i(m_j){}//这里改变顺序base():m_j(0),m_i(m_j){}int get_i(){return m_i;}int get_j(){return m_j;}};class A{static const int size=0;//静态,常量,整型才可以直接初始化。其他都不可以。};int main(int argc, char* argv){base obj(98);cout<<obj.get_i()<<endl<<obj.get_j()<<endl;base nn;cout<<nn.get_i()<<endl<<nn.get_j()<<endl;A nb;return 0;}
这里就有一个有趣的问题,虽然m_j出现在m_i前面,但m_i在m_j前面定义,所以先初始化m_i,此时m_j还是随机数,所以m_i就被初始化为一个随机数。
建议:按照成员的定义顺序进行初始化!
0 0
- c++构造函数中初始化列表的作用和机制
- 【深入理解C++】从初始化列表和构造函数谈C++的初始化机制
- 【深入理解C++】从初始化列表和构造函数谈C++的初始化机制
- 【深入理解C++】从初始化列表和构造函数谈C++的初始化机制
- 【深入理解C++】从初始化列表和构造函数谈C++的初始化机制
- 【C/C++】构造函数的初始化列表
- C++ 中使用构造函数初始化列表和普通构造函数内部初始化的区别
- 从初始化列表和构造函数谈C++的初始化机制
- 从初始化列表和构造函数谈C++的初始化机制
- 构造函数和初始化列表的区别
- C++ 在初始化列表中初始化和在构造函数内初始化的区别
- 构造函数的成员初始化列表有什么作用?
- c++中初始化列表和构造函数初始化
- 构造函数初始化列表和构造函数的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- 01背包(二维数组)+方案记录
- JVM
- rabbitmq学习笔记
- android——获取屏幕分辨率——Activity中/非Activity中
- #!/bin/bash
- c++构造函数中初始化列表的作用和机制
- js 打开一个新页面 window.open()
- HDU 1711 Number Sequence //简单kmp
- linux下5个查找命令find locate whereis which type
- 【leetcode】Word Break && Word Break II
- jquery 解析xml文档 读取属性及文本内容
- win8最好用的浏览器官网免费下载
- A - Babelfish(6.1.2)(6.1使用词典解题实验范例)
- SecureCRT上传下载文件