精华内容
下载资源
问答
  • 初始化列表

    2019-01-18 15:28:25
    初始化列表 我们知道构造函数的目的是为了初始化。而初始化类的成员有两种方式,一是在构造函数体内进行赋值操作,二就是使用初始化列表初始化列表是以冒号开头,后跟一系列以逗号分隔的初始 化字段。 在构造...

    初始化列表

    我们知道构造函数的目的是为了初始化。而初始化类的成员有两种方式,一是在构造函数体内进行赋值操作,二就是使用初始化列表。
    初始化列表是以冒号开头,后跟一系列以逗号分隔的初始
    化字段。

    在构造函数体内进行赋值操作:
    在构造函数体内进行赋值操作

    使用初始化列表:
    在这里插入图片描述

    注:
    1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
    2.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使 用初始化列表初始化。
    3.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

    对于内置类型,如int,double等,使用哪一种方法好像都没有太大的差别,但是对于类类型(该类没有默认构造函数)、引用成员变量、const成员变量这三种来说,必须使用初始化列表。

    我们先定义一个A类:
    在这里插入图片描述
    1.无默认构造函数的类类型的自定义类型:
    如果像普通的构造函数一样在函数内部进行初始化就会报错,如图
    在这里插入图片描述
    在这里插入图片描述
    这里就需要使用初始化列表了

    class B
    {
    public:
    	B(int x, A a)
    		:_x(x)
    		,_a(a)
    	{
    		
    	}
    private:
    	int _x;
    	A _a;
    };
    int main()
    {
    	B b(1, 10);
    }
    

    2.引用成员变量
    在这里插入图片描述

    也需要使用初始化列表

    class B
    {
    public:
    	B(A a, int y)
          : _a(a)
    	  , _y(y)
    	{	}
    	
    private:
    	A _a;
    	int& _y;
    };
    

    3.const成员变量

    在这里插入图片描述
    在这里插入图片描述
    同样需要使用初始化列表

    class B
    {
    public:
    	B(int x , A a)
          : _x(1)
          , _a(a)
        {	
        }
    	
    private:
    	const int _x;
    	A _a;
    };
    

    总结:尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使 用初始化列表初始化。

    class A
    {
    public:
    	A(int a = 0)
    	:_a(a)
    	{ }
    
    private:
    	int _a;
    };
    class B
    {
    public:
    	B(int x , A a,int y)
          : _x(1)
          , _a(a)
    	  , _y(y)
    	{	}
    	
    private:
    	const int _x;
    	A _a;
    	int& _y;
    };
    int main()
    {
    	B b(1, 10, 5);
    
    	system("pause");
    	return 0;
    }
    

    可以用调试的方法观察:
    在这里插入图片描述

    注意:成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

    例如下面的代码块

    class Array
    {
    public:
    	Array(int size)
    		:_size(size)
    		, _array((int*)malloc(sizeof(int)*_size))
    	{}
    private:
    	int* _array;		
    	int _size;
    };
    
    

    成员变量在声明时,先去初始化列表中初始化数组,此时数组中的_size未被初始化,为随机值,可能会造成栈溢出。所以,我们尽量将初始化列表中初始化的顺序和声明的顺序写的相同。

    展开全文
  • C++ 初始化列表

    万次阅读 2020-07-18 19:16:24
    //初始化列表 class Person{ public: //传统初始化操作 Person(int a, int b, int c) { m_A = a; m_B = b; m_C = c; } int m_A; int m_B; int m_C; }; void test01() { Person p(10,20, 30).
    #include <iostream>
    using namespace std;
    #include <string>
    
    
    
    //初始化列表
    class Person{
    public:
    	//传统初始化操作
    	Person(int a, int b, int c) {
    		m_A = a;
    		m_B = b;
    		m_C = c;
    	}
    	
    
    	int m_A;
    	int m_B;
    	int m_C;
    };
    
    void test01() {
    	Person p(10,20, 30);
    
    	
    	cout << "m_A=" << p.m_A << endl;
    	cout << "m_B=" << p.m_B << endl;
    	cout << "m_C=" << p.m_C << endl;
    }
    
    int main() {
    
    	test01();
    	system("pause");
    
    }
    #include <iostream>
    using namespace std;
    #include <string>
    
    
    
    //初始化列表
    class Person{
    public:
    	//传统初始化操作
    	/*Person(int a, int b, int c) {
    		m_A = a;
    		m_B = b;
    		m_C = c;
    	}
    	*/
    
    	//初始化列表初始化属性
    	Person(): m_A(10),m_B(20),m_C(30){}
    
    
    	int m_A;
    	int m_B;
    	int m_C;
    };
    
    void test01() {
    //	Person p(10,20, 30);
    
    	Person p;
    	cout << "m_A=" << p.m_A << endl;
    	cout << "m_B=" << p.m_B << endl;
    	cout << "m_C=" << p.m_C << endl;
    }
    
    int main() {
    
    	test01();
    	system("pause");
    
    }

    上面两种方式都正常的输出:

    不过我们发现第二种的初始化列表写死了,不够灵活,我们怎么才能灵活的赋值

    #include <iostream>
    using namespace std;
    #include <string>
    
    
    
    //初始化列表
    class Person{
    public:
    	//传统初始化操作
    	/*Person(int a, int b, int c) {
    		m_A = a;
    		m_B = b;
    		m_C = c;
    	}
    	*/
    
    	//初始化列表初始化属性
    	Person(int a, int b, int c): m_A(a),m_B(b),m_C(c){}
    
    
    	int m_A;
    	int m_B;
    	int m_C;
    };
    
    void test01() {
    //	Person p(10,20, 30);
    
    	Person p(30,50,60);
    	cout << "m_A=" << p.m_A << endl;
    	cout << "m_B=" << p.m_B << endl;
    	cout << "m_C=" << p.m_C << endl;
    }
    
    int main() {
    
    	test01();
    	system("pause");
    
    }

    这个初始化值就比较灵活了

     

    展开全文
  • c++成员变量初始化方法:声明时初始化、初始化列表、构造函数初始化 有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后...

    c++成员变量初始化方法:声明时初始化、初始化列表、构造函数初始化

    有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化,如下代码:(另外初始化列表中初始化的顺序是和变量声明的顺序一样,而与列表中的顺序无关)

    1 #include "stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 class A 
     5 {
     6 public:
     7     int a = 1;
     8     A() {}
     9     A(int a_):a(a_){}
    10     A(int a_, bool b) :a(4) { a = a_; }
    11 };
    12 
    13 int main()
    14 {
    15     A a1, a2(3), a3(5, true);
    16     cout << "a1.a=" << a1.a << endl;
    17     cout << "a2.a=" << a2.a << endl;
    18     cout << "a3.a=" << a3.a << endl;
    19     system("pause");
    20     return 0;
    21 }
    

    结果如图,可看出,初始化列表初始化的变量值会覆盖掉声明时初始化的值,而构造函数中初始化的值又会覆盖掉初始化列表的,足以看出初始化的顺序:

    在这里插入图片描述

    另外有人说这种初始化方式破坏了类的抽象性。是的,一定程度上,但是却能带来很大便捷。好比一台机器能够生产某种零件,零件的各个尺寸可以在一定程度任意改变,但是我们并不是每次生产这种零件都需要一个一个地给定每一个参数,然后再生产,机器会自己带有一套“默认”的零件尺寸参数,这样新手可以直接用默认参数生产,除非你知道每一个参数都是干啥的,否则没必要更改。那么也可以在构造函数中给出这一套“默认参数”啊,是的,但是假如你有10个构造函数,那么你每一个都要复制一次所有成员变量的默认参数吗?显然在做重复的无用工作,那么为什么不直接在声明的时候就初始化!


    参考:https://www.cnblogs.com/blog-vincent-0x1F7/p/9668524.html

    展开全文
  • 初始化列表初始化顺序

    千次阅读 2018-07-23 09:15:01
    初始化列表是按类中声明变量的先后顺序来初始化,与初始化列表的顺序无关。   class Printer{ public: Printer(std::string name) {std::cout &lt;&lt; name;} }; class Container{ public: ...

    输出结果为ab

    初始化列表是按类中声明变量的先后顺序来初始化,与初始化列表的顺序无关。

     

    class Printer{
        public:
            Printer(std::string name) {std::cout << name;}
    };
    class Container{
        public:
            Container() : b("b"), a("a") {}
        Printer a;
        Printer b;
    };
    int main(){
        Container c;
        return 0;
    }

     

    展开全文
  • c++中的初始化列表详解

    万次阅读 多人点赞 2018-05-18 18:15:04
    与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。 class foo { public: foo(string s, int i):name(s), id(i){} ; //...
  • 初始化列表和初始化函数的区别   初始化列表和初始化函数在一般情况下没什么区别,在有const修饰的数据成员时要用初始化列表。   但是对于数据成员有非内置类型(如类)的成员时,使用初始化列表和初始化函数是...
  • 初始化列表初始化的顺序和变量声明的顺序一致,和初始化中的顺序无关。这里的代码中i比j先声明,所以这里的初始化的顺序应该是先用j对i初始化,然后再用k对j初始化。由于在对i初始化的时候j并没有被初始化...
  • 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public: int a; float b; //构造函数初始化列表 CExample(): a...
  • 初始化列表中初始化数组

    千次阅读 2019-03-23 14:28:54
    学习了一下前缀树。 需要用到一个结构体保存两个指针,如下 struct Node ...能不能将初始化操作放在初始化列表中呢,如下 以上两种写法都有问题,突然想到,数组应该用大括号初始化啊 就酱。 ...
  • Python初始化列表

    万次阅读 2019-04-29 18:17:49
    Python初始化列表 下面我们就来介绍在Python中初始化列表(我们创建大小为1000并使用零初始化的列表)的一些方法。 1)方法一:使用for循环和append()函数 arr = [] for i in range(1000): arr.append(0) 2)方法...
  • C++初始化列表

    2018-08-28 14:43:30
    除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表: 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不...
  • 成员初始化列表

    2019-09-07 20:45:26
    对于一个类来说,在1、构造函数初始化列表中初始化数据成员 和 2、在构造函数中对他们赋值,得到的结果都是一样的。但是遇到以下三种情况时只能采用初始化列表方法: 对于const类型的成员变量,只能采用初始化...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,240
精华内容 8,096
关键字:

初始化列表