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

初始化引用 - 警告C4355:'this':用于基本成员初始化列表

警告C4355是指在C++编程中的一种警告信息,它表示在基本成员初始化列表中使用了"this"指针。"this"指针是一个指向当前对象的指针,它在成员函数中可以使用。然而,在基本成员初始化列表中使用"this"指针可能会导致一些问题。

基本成员初始化列表是在构造函数的定义中使用的一种语法,用于初始化类的成员变量。它在构造函数的函数体之前执行,并且可以通过使用成员变量的初始化列表来初始化成员变量。

警告C4355的出现是因为在基本成员初始化列表中使用了"this"指针,这可能会导致一些潜在的问题。"this"指针在构造函数的初始化列表中使用时,可能会导致访问尚未初始化的成员变量,或者在成员变量的初始化之前使用它们。

为了避免警告C4355,可以考虑以下几种解决方法:

  1. 将"this"指针从基本成员初始化列表中移除,改为在构造函数的函数体中使用。这样可以确保成员变量已经初始化完成后再使用它们。
  2. 调整成员变量的初始化顺序,确保在使用它们之前已经完成了初始化。这样可以避免在基本成员初始化列表中使用"this"指针时出现问题。
  3. 重新设计类的构造函数,避免在基本成员初始化列表中使用"this"指针。可以考虑使用其他方式来初始化成员变量,例如在构造函数的函数体中进行初始化。

总结起来,警告C4355是一种提醒开发者在基本成员初始化列表中使用"this"指针可能导致问题的警告信息。为了避免这个警告,可以通过调整代码逻辑或重新设计构造函数来解决。

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

相关·内容

EasyC++73,成员初始化列表

这是EasyC++系列的第73篇,来聊聊成员初始化列表成员初始化列表 除了可以使用构造函数对类成员进行初始化之外,C++还提供了另外一种初始化的方法,叫做成员初始化列表。...mem3(n*m+2) { ... }; 上述代码将mem1初始化为n,将mem2初始化为了0,mem3初始化成了n*m+2。...有这么几点需要注意: 这种格式只能用于构造函数 必须用这种格式初始化非静态const数据成员(C++11之前) 必须用这种格式初始化引用数据成员 数据成员初始化的顺序和它们在类中定义的顺序相同,和初始化列表中的排列顺序无关...C++11的类内初始化 C++11当中允许我们直接对成员变量进行赋值: class Classy { int mem1 = 10; const int mem2 = 20; }; 这和在构造函数当中使用成员初始化列表等价...我们在类当中直接初始化之后,我们也可以在成员初始化列表当中进行覆盖: Classy::Classy(int n) : mem1(n) {...} 在这种情况下,mem1的值会被替换成n。

12620

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

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

16630

C++_const 常量成员以及成员初始化列表及其常量类

常量成员以及成员初始化列表 1.知识点介绍 常量成员,指的是在C++类中声明对象成员时可以加上const关键字,这样声明的成员叫常量成员, 常量成员分为常量数据成员和常量函数成员 2.常量数据成员...3.成员初始化列表 常量数据成员也在构造函数范围内, 但是常量数据成员值无法改变....‘,’号隔开 int main() { CA a, b(15); cout << a.id << endl; cout << b.id << endl; } 初始化列表的特性 1、初始化列表也是实现类中成员数据的初始化的一种方式...2、一些特殊情况下,数据成员初始化只能用初始化列表的方式给数据成员赋值,而不能在构造函数中 直接赋值 3、初始化列表必须写在构造函数的定义体后面 4、构造函数能对数据的初始化工作,初始化列表也可以,...但是初始化列表能做的,构造函数不一定能 5、初始化列表初始化顺序是按照他们在类中出现的顺序来初始化的,而不是在初始化列表中写的顺序 来初始化的 4.常量函数成员 #include using namespace

89830

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

1.2 初始化列表 语法: 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...如果成员是const 或 引用变量的话,必须将其初始化。类似的如果存在自定义类型并且该类不存在构造函数时,也必须将其初始化。...注意: 每个成员变量在初始化列表中只能出现一次(初始化只能一次) 类中包括以下成员,必须在初始化列表进行初始化引用成员变量 const成员变量 自定义类型成员(并且该类没有默认构造函数时)...尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。...作为结果,静态成员函数不能声明成const 的而且我们也不能在static 函数体内使用this指针。这一限制及适用于this的显式使用,也对调用非静态成员的隐式使用有效。

19710

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

2.2 初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个**"成员变量"后面跟一个放在括号中的初始值或表达式**。...所以c++中用了初始化列表初始化列表是每个成员变量定义初始化的位置。 下面的成员变量也会走初始化列表,他们也要定义,只是没有给值就是随机值,如果给了值就直接初始化。...初始化列表是每个成员变量定义初始化的位置, 能用初始化列表就建议用初始化列表。 不用也会先走初始化列表。 哪些成员必须用初始化列表呢?...这里是显示的调构造 【注意】 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化,不能在函数体内初始化: (1)引用成员变量...(2)const成员变量 (3)自定义类型成员(且该类没有默认构造函数时) 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化

9210

C++深拷贝与浅拷贝,初始化列表,对象成员,静态成员相关分析

初始化列表 作用: C++提供了初始化列表语法,用来初始化属性 语法:构造函数():属性1(值1),属性2(值2)... {} 示例: class Person { public: ////传统方式初始化...//Person(int a, int b, int c) { // m_A = a; // m_B = b; // m_C = c; //} //初始化列表方式初始化: Person...~Phone() { cout << "Phone析构" << endl; } string m_PhoneName; }; class Person { public: //初始化列表可以告诉编译器调用哪一个构造函数...在编译阶段分配内存 类内声明,类外初始化 静态成员函数 所有对象共享同一个函数 静态成员函数只能访问静态成员变量 示例1 :静态成员变量 class Person { public: static...//2 类内声明,类外初始化(即必须有初始值,否则无法访问这块内存) //3 所有对象共享同一份数据 private: static int m_B; //静态成员变量也是有访问权限的 }; int

82251

C++那些事之类成员初始化列表中的注意事项

C++那些事之类成员初始化列表中的注意事项 在C++中,类的正确初始化是确保程序正常运行的关键步骤之一。尤其是在使用初始化列表时,我们需要注意一些潜在的陷阱,以避免在代码执行过程中产生意外的结果。...初始化列表通常被认为是设置新类实例状态的首选方法,因为它提供了一种简洁、高效的方式来初始化成员。然而,有时候在初始化列表引用其他成员变量可能导致一些令人困惑的问题。...length_; int capacity_; int size_; }; int main() { Foo foo(50); foo.print(); } 在这个例子中,我们试图通过初始化列表引用其他成员变量的方式来初始化...然而,由于类成员初始化顺序是按照它们在类中声明的顺序进行的,可能导致length_与capacity_并没有按照我们期望的方式初始化。 如何解决?...为了避免这种问题,应该遵循以下几点: 1.避免在初始化列表引用其他成员变量 2.顺序一致性:成员变量的初始化顺序是按照它们在类中声明的顺序 修正示例: #include class

10010

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

002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(28): error C2280: “B::B(void)”: 尝试引用已删除的函数...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 在 C++ 语言中 , 构造函数初始化列表...是一种用于初始化类的成员变量的方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量的 构造函数 来初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...(成员变量值) , 成员变量名称(成员变量值) { // 构造函数内容 } 构造函数初始化列表 位置在 构造函数 的 参数列表之后 , 冒号 : 与花括号 {} 之间 ; 使用 逗号 , 分隔 ;...初始化列表中的元素由 成员变量的名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码中 , 为 B 类定义了默认的构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表中 , m_age

43230

C++类与对象(四):再谈构造函数(详解初始化列表)、Static成员

赋值操作符=用于将一个值赋给一个已经存在的变量 初始化是在变量创建时进行的,而赋值是在变量已经存在的情况下进行的 初始化可以只进行一次,而赋值可以进行多次 在一些情况下,初始化可能比赋值更加高效,因为它可以在对象创建时直接将初始值传递给对象...,而不需要额外的操作 1.2初始化列表 1.2.1格式和概念 初始化列表成员变量定义处 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式...解决方案: 写出来默认构造 在初始化列表处显示地写出来 1.2.3特性 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化:(在由来里讲了...) 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化 成员变量在类中声明次序就是其在初始化列表中的初始化顺序...,与其在初始化列表中的先后次序无关 解决的问题: 必须在定义的地方显示地初始化引用 const 没有默认构造函数的自定义成员 有些自定义成员想要自己控制自己的初始化 1.2.4特殊情况 class Stack

36710

从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

一、构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化 #include  using namespace...从输出可以看出几点,一是构造对象之前,必须先构造对象的成员;二是对象成员构造的顺序与定义时的顺序有关,跟初始化列表顺序无关;三是构造的顺序和析构的顺序相反;四是如果对象成员对应的类没有默认构造函数,那对象成员也只能在初始化列表进行初始化...(二)、const成员引用成员初始化 #include  using namespace std; // const成员初始化只能在构造函数初始化列表中进行 // 引用成员初始化也只能在构造函数初始化列表中进行...// 对象成员(对象成员所对应的类没有默认构造函数)的初始化,也只能在构造函数初始化列表中进行 class Object { public:     enum E_TYPE     {         ...因为const 变量或者引用都得在定义的时候初始化,所以const 成员引用成员必须在初始化列表初始化。另外,可以使用定义枚举类型来得到类作用域共有的常量。

1.2K00

C++11-列表初始化变量类型推导范围forfinal&override默认成员函数控制

C++11-列表初始化/变量类型推导/范围for/final&override/默认成员函数控制 零、前言 一、C++11简介 二、列表初始化 1、内置类型列表初始化 2、自定义类型列表初始化 三、变量类型推导...相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率 二、列表初始化 背景引入: 在C++98中,标准允许使用花括号...{}对数组元素进行统一的列表初始值设定 示例: int array1[] = {1,2,3,4,5}; int array2[5] = {0}; 注:对于一些自定义的类型,却无法使用这样的初始化...1、内置类型列表初始化 C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加 示例: int...{}之前使用等号,其效果与不使用=没有什么区别 2、自定义类型列表初始化 标准库支持单个对象的列表初始化 class Pointer { public: Pointer(int x = 0

68260

【细品C++】类和对象的一些细节(初始化列表、友元、static成员等)

初始化列表 初始化列表使用格式:在构造函数函数名与函数体({})之间,以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。...int n;//定义,但并未初始化,此时是随机值 n = 0;//赋值,不是初始化 int x = 0;//定义并初始化为0 而对于由const修饰的类型以及引用类型,定义时初始化是其唯一的赋值机会,所以需要初始化列表来解决像这样的问题...以上就是对于初始化列表基本介绍以及为什么要有初始化列表,接下来总结一下初始化列表的注意事项: 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) class date { public:..._day; }; 类中包含以下成员,必须放在初始化列表位置进行初始化引用成员变量 const成员变量 自定义类型成员变量(且该类型没有默认构造函数时) 尽量使用初始化列表初始化。...友元分为:友元函数和友元类 友元函数 先来个例子引入,以class date为例,假设我要为这个类重载operator<<成员函数,用于打印我想要的数据。

33320

Java——数组的定义与使用(基本概念、引用分析、初始化方式、二维数组、对象数组)

1、数组的基本概念 数组指的是一组相关变量的集合。Java中,数组属于引用数据类型,所以必然牵扯到内存的关系。...数据类型 数组名称[] = new 数据类型 [长度]; 分布完成: 数据类型 数组名称[] = null; 数组名称 = new 数据类型 [长度]; 以上可以看出定义格式 和 实例化对象的思路基本一致...2、数组的引用分析 引用数据类型分析基本一致,与对象的流程一样的,唯一的区别就是普通类的对象是保存属性,利用属性名称操作,而数组保存的是内容,利用索引来操作。 ?...【举例】:数组的引用操作 int data[] = new int[3]; data[0] = 10; data[1] = 20; data...3、数组的静态初始化 以上数组的动态初始化,其特点是,先开辟数组内容空间,再进行内容的赋值,若想数组开辟后直接存在明确内容,可以使用数组的静态初始化: 简化型    数组类型 数组名称 [] = {值,

1.5K20

【c++】类和对象(六)深入了解隐式类型转换

int _year; int _month; int _day; 这三个成员既可以在函数体,又可以在初始化列表,但是类中包含以下成员,必须放在初始化列表位置进行初始化引用成员变量 const成员变量..._year、_month、和_day这三个成员变量,它们仍然会在初始化列表阶段被默认初始化,然后在构造函数体内被赋新的值 对于基本类型(如int),如果它们未在类的初始化列表中显式初始化,则它们会进行默认初始化...对于类内的基本类型成员变量,默认初始化意味着不进行初始化(保留未定义值),除非它们是静态存储持续时间的对象(例如全局或静态变量,它们会被初始化为零)。...} 在这个版本中,所有成员变量都是通过初始化列表直接初始化的,这是推荐的做法,特别是对于复杂类型或类类型的成员变量 引用类型必须在定义的时候初始化,所以也得使用初始化列表 class A { public...这行代码会导致编译错误,原因如下: 引用基本要求:在C++中,引用必须绑定到一个已经存在的对象上。

5410

《Effective C++》读书摘要

三、const const返回值:避免(a*b)=c的错误; const参数:传递指向常量的引用; const成员函数:允许const属性的重载。 四、对象使用前初始化 构造函数成员初始化列表; ?...(六)、继承与面向对象设计 三十二、确定public继承塑膜出is-a关系 适用于基类的事情也适用于子类。 三十三、避免遮掩继承来的名称 基类的重载函数一旦在子类被重写后,其他的同名函数无法访问。...三十五、考虑虚函数以外的选择 私有虚函数在父类被调用的时候自动多态,基本保留何时调用的权力,子类拥有修改功能的权力; ? function函数指针对象使得函数指针更加灵活; 古典策略模式: ?...四十二、typename双重含义 模板声明中与class没有任何区别; 嵌套从属类型的显式指定,不能出现在基类列表初始化列表中; ?...(九)、杂项 五十三、不要忽视警告 严肃对待警告信息; 不过度依赖警告信息。 五十四、熟悉TR1标准库 智能指针、Boost库。 五十五、熟悉Boost 社群、网站; TR1组件实现品。

1.9K60

类——构造函数之初始化列表

---- ---- 前言         在我们已经基本了解了类的由来,和其六大基本默认函数后,此时我们再回过头来看,其中的构造函数。...1.2.2初始化列表的格式 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。...类中包含以下成员,必须放在初始化列表位置进行初始化:         ①引用成员变量 引用变量为随机值,是一种很危险的行为(引用是由C语言的指针修改而来,本质上还是指向内存的地址)         ②const...我们发现这2个地方,若都有赋值的话,则会优先初始化列表的赋值,由此我们可以推出以下结论,成员变量处的默认值,是作用于初始化列表的,而不是用于构造函数体内的,且该值为初始化列表的缺省值(我们可以取一个形象一点的名字...:初始化列表的缺省值——定义缺省值) 1.2.5初始化列表的顺序 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后 次序无关。

78820

Java编程思想第五版精粹(五)-初始化和清理(下)

1.2 类的成员变量 类的成员变量是基本类型时,每个基本类型数据成员保证都会有一个初始值。 引用的默认值为 null。...这种情形对于所有的基本类型和引用及在定义时已指定初值的变量,都成立。 因此,编译器不会强制你要在构造器的某个地方或在使用它们前初始化——初始化早已得到了保证。...2.2 static数据的初始化 静态数据只占用一份存储区域。 static 不能用于局部变量,只能作用于属字段。...如果一个字段是static的基本类型,你没有初始化它,那么它就会获得基本类型的标准初值 如果它是对象引用,那么它的默认初值就是 null。...维护长列表更容易,但只能用于数组定义处。

44341

C# 8.0 可空引用类型中的各项警告错误的含义和示例代码

C# 8.0 引入了可为空引用类型和不可为空引用类型。当你需要给你或者团队更严格的要求时,可能需要定义这部分的警告和错误级别。...本文将介绍 C# 可空引用类型部分的警告和错误提示,便于进行个人项目或者团队项目的配置。...C# 8.0 如何在项目中开启可空引用类型的支持 - 吕毅 C# 可空引用类型 NullableReferenceTypes 更强制的约束:将警告改为错误 WarningsAsErrors - 吕毅 警告和错误...GetText() { return null; } CS8609 返回类型中引用类型的为 Null 性与重写成员不匹配。...CS8618 未初始化不可以为 null 的字段 “_walterlv”。 如果一个类型中存在不可以为 null 的字段,那么需要在构造函数中初始化,如果没有初始化,则会发出警告或者异常。

40720

【C语言】自定义类型:结构体深入解析(一)

结构体类型的声明和创建,然后就是结构体的初始化,随即学习结构成员的访问操作符来更好的打印结构体的数据,当然还有匿名结构体类型,和结构的自引用。文章干货满满,接下来我们就学习一下结构体吧 !...: 可以通过在列表中指定成员名来指定成员初始化顺序: 例如: struct Stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 char...结构成员访问操作符用于访问结构体中的成员变量。...return 0; } 输出没问题但有警告警告: 编译器会把上⾯的两个声明当成完全不同的两个类型,所以是⾮法的。...匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。 结构的⾃引⽤ 结构的自引用指的是结构体内部包含自己类型的指针成员,通过这个指针可以实现结构体之间的引用关系。

7510

C++学习知识点

6.初始化列表 C++中,构造函数与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。...: 主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,使用初始化列表少了一次调用成员的默认构造函数的过程...使用const修饰的引用表示常引用,即引用的变量是常变量,这样一来,是防止在函数中对常引用的修改,多用于修饰类的常对象。如果将值调用的形参声明为常量,则没有多大的使用价值。...深拷贝存在的情况就是在类成员中有非基本数据类型的变量时,比如指针,数组或者引用。...对于类定义对象什么时候用new,什么时候不用new的认识 (1) 构造函数只适用于成员初始化,与分配类对象的空间无关; (2) 隐式执行默认构造函数,初始化申明在栈上的类对象,直接申明,不要使用

1.7K20
领券