首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++:newbie初始化列表问题

C++ 初学者常遇到的初始化列表(Initializer List)问题,主要发生在以下场景:

场景一:类有构造函数和析构函数

当类包含构造函数和析构函数时,C++ 规定必须使用初始化列表。这是因为构造函数和析构函数不能自动调用,需要初始化列表明确列出这些函数的参数。

例如:

代码语言:cpp
复制
class MyClass {
public:
    MyClass() : m_value(42) {}
    ~MyClass() {}

private:
    int m_value;
};

场景二:类无拷贝构造函数和赋值运算符

如果类没有拷贝构造函数和赋值运算符,编译器将默认生成一个,但编译器生成的拷贝构造函数和赋值运算符通常没有考虑初始化和赋值操作。如果类需要自定义拷贝构造函数和赋值运算符,则必须在类定义中显式声明,并使用初始化列表。

例如:

代码语言:cpp
复制
class MyClass {
public:
    MyClass(const MyClass& other) : m_value(other.m_value) {}
    MyClass& operator=(const MyClass& other) {
        m_value = other.m_value;
        return *this;
    }

private:
    int m_value;
};

场景三:使用 new 运算符创建对象

当使用 new 运算符创建对象时,如果类没有默认构造函数,编译器会生成一个构造函数。如果类有自定义构造函数,则必须使用初始化列表。

例如:

代码语言:cpp
复制
MyClass* obj = new MyClass(); // 使用自定义构造函数

场景四:使用 new 运算符创建对象,同时初始化

当使用 new 运算符创建对象,并同时初始化对象时,必须使用初始化列表。

例如:

代码语言:cpp
复制
MyClass* obj = new MyClass(42); // 使用自定义构造函数和初始化列表

总之,当类包含构造函数和析构函数,类无拷贝构造函数和赋值运算符,使用 new 运算符创建对象,或同时初始化对象时,必须使用初始化列表。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++初始化列表

一、什么是初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段 二、构造函数执行分为初始化和构造两个阶段,且初始化化阶段优先于计算阶段...三、一个好的原则是,能使用初始化列表的时候尽量使用初始化列表 因为初始化列表有时能少调用一次默认构造函数 四、必须要用初始化列表的时候 1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面...2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 3....没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化 五 、成员变量是按照在类中声明的顺序被初始化的而不是在初始化列表中的顺序 struct foo...foo(int x):j(x), i(j){} // i值未定义 }; 这里i的值是未定义的因为虽然j在初始化列表里面出现在i前面,但是i先于j定义,所以先初始化i,而i由j初始化,此时j尚未初始化

74990

C++初始化列表

问题 类中是否可以定义 const 成员?...t20.cpp:13:10: error: uninitialized const member in ‘class Test’ Test t; 代表类中可以定义const成员变量, 但是面临的问题是...: 如何初始化类中const 成员变量 这时候引入本文的重点, 初始化列表出场: 类成员的初始化 C++ 中提供了初始化列表对成员变量进行初始化 语法规则 ClassName::ClassName(...成员的初始化顺序与初始化列表中位置无关 初始化列表先于构造函数的函数体执行 修改上述代码如下: #include class Test { private: const...小结 类中可以使用初始化列表对成员进行初始化 初始化列表先于构造函数体执行 类中可以定义const 成员变量 const 成员变量必须在初始化列表中指定初值 const 成员变量为只读变量

79260

C++构造函数初始化列表

构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用初始化列表。...C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: #include using namespace std; class Student{...使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。初始化列表可以用于全部成员变量,也可以只用于部分成员变量。...){ m_age = age; m_score = score; } 注意,成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关...初始化 const 成员变量 构造函数初始化列表还有一个很重要的作用,那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用初始化列表

18040

C++初始化列表深入探索

必须要使用初始化列表的情况: 1. 当初始化一个引用的成员 2. 当初始化一个const的成员 3. 当调用一个基类的对象(该类继承于基类),且基类有含有参数的构造函数时 4....我们暂且先不判断放在函数体中的初始化的好坏,我们先来使用初始化列表的方式对其初始化一下看看结果是什么样的,初始化列表方法运行结果: ?      ...,因此效率上会有大的提升,那么对于一些简单的成员进行初始化的时候(比如int类型),其实二者没有太大的区别,但是还是建议都是用初始化列表进行初始化。...初始化列表的细节问题: 1. 虽然初始化列表的写法比较奇怪,但是站在编译器的角度来看,实际上初始化列表的代码还是被安插在函数体中去执行。...2.当自己在函数体中已经写了一部分的代码,那么初始化列表的代码是优先于自己写的代码执行的。 3.对于对象成员的初始化顺序,是按照对象成员的定义顺序执行的,而不是按照初始化列表的顺序执行的。

60810

C++ 类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: ? 上面的例子中两个构造函数的结果是一样的。...上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。...初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数: ?...初始化列表的成员初始化顺序: C++ 初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。 ?...有两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。

1.9K20

C++初始化列表学习总结

大家周末好,本次给大家分享的内容是C++里面的初始化列表运用,希望对大家有帮助。...同时这里我们也要注意初始化列表的使用原则: (1)成员的初始化顺序与成员的声明顺序相同。 (2)成员的初始化顺序与初始化列表中的位置无关。 (3)初始化列表优先于构造函数的函数体执行。...我们接着上面那个初始的问题,现在我们使用初始化列表来看看啥情况: #include class Test{ private: const int a; public:...四、总结: (1)类中可以使用初始化列表对成员进行初始化。 (2)初始化列表先于构造函数体执行。 (3)类中可以定义const成员变量。 (4)const成员变量必须在初始化列表中指定初值。...纯属个人学习c++的成长之旅。

21310

C++初始化列表详细剖析

一、初始化列表定义 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。..._day(day) {} private: int _year; int _month; int _day; }; 二、初始化列表内在作用的剖析 不知道大家有没有想过这样一个问题,成员函数明明可以在函数内部对成员变量进行赋值...四、初始化列表使用的建议以及小点 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量, 一定会先使用初始化列表初始化。...但是我们能不能什么地方都用初始化而都不在函数体内部赋初始值呢?答案是不行的。初始化列表可以解决百分之九十的问题,但对于一些像判断之类的语句还是要放在函数体内部的。...成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

15910

C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ; 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...中传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 的 初始化列表 中 为 const 成员变量初始化 1、初始化 const 常量成员 如果 类 中定义了 被 const 修饰 的 成员变量..., 那么该成员变量 必须被初始化 , 否则会报错 ; 对象中的 const 成员 必须在 声明后 立刻进行初始化 ; const 成员的初始化 只能通过 构造函数 的 初始化列表 进行初始化 ; 注意..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 在初始化列表初始化常量成员 在下面的 类 B 中 , 所有的 构造函数 中 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

16730

C++列表初始化,你知多少?

我是木荣,今天我们学习一下C++列表初始化相关的知识。 unsetunset1、何为列表初始化unsetunset C++中的列表初始化是一种用一对花括号 {} 来进行对象初始化的语法。...列表初始化在 C++11 标准中被引入,是现代 C++ 编程风格的一部分。...在 C++11 引入的列表初始化中,提供了对缩窄转换的更严格的检查,不允许在列表初始化时发生缩窄转换,从而帮助程序员避免潜在的问题。..."Most Vexing Parse" 是一个有趣而令人困扰的 C++ 编程问题,它通常发生在类的对象声明上,导致程序员可能不是按照他们预期的方式初始化对象。...: MyClass obj(); // 编译器会将其解释为函数声明 MyClass obj{}; // 使用括号初始化,避免 most vexing parse 这个问题是由 C++ 语法规则引起的

5110

C++】构造函数初始化列表 ① ( 类对象作为成员变量时的构造函数问题 | 构造函数初始化列表语法规则 )

一、类对象作为成员变量时的构造函数问题 1、问题描述 如果 一个类 A 的对象 作为 另外一个类 B 的成员变量时 , 在以下场景会报错 : 为类 A 定义 有参的 构造函数 , 那么 A 的无参默认构造函数就失效了...就是 C++ 中的 构造函数 初始化列表 ; 2、错误代码示例 代码示例 : #include "iostream" using namespace std; class A { public:...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 在 C++ 语言中 , 构造函数初始化列表...是一种用于初始化类的成员变量的方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量的 构造函数 来初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...初始化列表中的元素由 成员变量的名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码中 , 为 B 类定义了默认的构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表中 , m_age

43730

C++】类与对象—— 初始化列表 、static 静态成员、

因为初始化只能初始化一次,而构造函数可以多次赋值。进而我们有了初始化列表的概念。...1.2 初始化列表 语法: 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...在很多类中初始化和赋值的区别事关底层效率的问题:前者直接初始化数据成员,后者则先初始化再赋值。除了效率问题外更重要的是,一些数据成员必须初始化。...需要注意的是初始化列表不限定初始化的执行顺序,因为成员初始化的顺序与他们在类出现顺序一致,第一个成员先初始化,然后第二个,以此类推,因此构造函数初始化列表的前后位置并不影响实际的初始化顺序。...尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

20510

C++】类和对象之初始化列表与static成员

前言 在前面的博客中已经分享有关构造函数 【C++】构造函数和析构函数详解,这次又再一次提到构造函数,一起来看看。 2....所以c++中用了初始化列表初始化列表是每个成员变量定义初始化的位置。 下面的成员变量也会走初始化列表,他们也要定义,只是没有给值就是随机值,如果给了值就直接初始化。...在既有缺省值(不给值就用缺省值)又有初始化列表,走的是初始化列表的值。 先走初始化列表再走下面的赋值修改 那么函数体和初始化列表哪个好用呢?...初始化列表是每个成员变量定义初始化的位置, 能用初始化列表就建议用初始化列表。 不用也会先走初始化列表。 哪些成员必须用初始化列表呢?...类名::静态成员 或者 对象.静态成员 来访问 静态成员函数没有隐藏的this指针,不能访问任何非静态成员 静态成员也是类的成员,受public、protected、private 访问限定符的限制 有问题请指出

9310

C++构造函数体内赋值与初始化列表的区别

Linux环境下,使用g++编译以下使用初始化列表的代码时出现编译错误error: expected '{' before 'this'。...,不能使用this指针,因为对象完成初始化之前,类对象还未成形,以上问题的解决办法就是去掉this。...答案是可以,因为构造函数对成员数据的初始化在是在初始化列表中完成的,构造函数体内对数据成员所做的工作仅仅是赋值操作,在此之前,类成员数据已经完成了初始化工作,是由其默认构造函数完成的。...所以,这也是编程原则中尽量使用初始化列表的原因。...将上面错误代码的类数据成员的初始化改为在构造函数体内赋值,则没有问题,代码修改如下: class someClass { int num; string studentNmae; public:

1.4K21

C++构造函数体内赋值与初始化列表的区别

1.C++构造函数初始化列表处提示出现 error: expected ‘{’ before ‘this’ 问题描述下: Linux环境运行,使用g++编译,贴上如下代码出错处已标注于代码中。...在得知网友点拨后,才知道其原因是类对象完成初始化之前,类对象还未成形,不能使用this指针。以上问题的解决方案就是去掉this。...---- 2.初始化列表中不能使用this,那构造函数体内是否可以使用this呢?...答案是,当然可以,因为构造函数对成员数据的初始化在是在初始化列表中完成的,构造函数体内对数据成员所做的工作仅仅是赋值操作,在此之前,类成员数据已经完成了初始化工作,是由其默认构造函数完成的。...所以,这也是编程原则中尽量使用初始化列表的原因。

84420

C++中变量自动初始化问题

C++中有一些变量在如果没有赋初值会被编译器自动赋值为0,但有的变量又不会这样,而得到一个随机数,下面具体讨论一下: 首先看一下C++中的几个存储区: 1、栈区:由编译器自动分配释放 ,存放函数的参数值...3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。...在上述的几个存储区域中,如果定义在全局区的变量没有被用户初始化的话,编译器会自动将其初始化为0。 这里要非常注意定义两个字而不是声明。...既然声明都不分配内存,所以自然也不可能被编译器自动初始化为0了。...结论:一些全局变量(不管用没用static修饰)或者是使用static中修饰的局部变量在定义的时候都会被编译器自动初始化为0,而在声明的时候任何变量都不会被编译器自动初始化

1.4K70

C++类和对象】初始化列表与隐式类型转换

目录 前言 1.初始化列表 1.1初始化列表定义 1.2初始化列表原因 1.3初始化列表注意点 2. explicit关键字 2.1explicit关键字定义 2.2隐式类型转换 2.3explicit...关键字使用 3.结语 1.初始化列表 1.1初始化列表定义 C++中的初始化列表是一种在对象构造函数中初始化成员变量的方法。...1.2初始化列表原因 在C++类和对象中有些成员变量必须定义的时候初始化,这时候如果只是简单的使用构造函数来赋值是不可行的,所以C++引入了初始化列表这个概念; 类中包含以下成员,必须放在初始化列表位置进行初始化...) 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。...3.结语 初始化列表C++类和对象中初始化成员变量的方式,在一些情况下可以提高效率和代码可读性。

9310
领券