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

C++通过分配其他构造函数初始化的类成员来初始化类成员是不是一个坏主意?

C++通过分配其他构造函数初始化的类成员来初始化类成员并不是一个坏主意。这种方式被称为委派构造函数,它可以提高代码的可读性和可维护性。

委派构造函数允许一个构造函数调用同一个类的另一个构造函数来完成成员的初始化。这样做的好处是可以避免代码重复,减少错误的可能性,并且使得代码更加清晰。

通过委派构造函数初始化类成员还可以提供更多的灵活性。例如,当类的不同构造函数需要初始化不同的成员变量时,使用委派构造函数可以更方便地实现这一需求。

然而,需要注意的是,在使用委派构造函数时,需要确保所有的成员变量都能被正确地初始化。否则,可能会导致未定义的行为或错误的结果。

在腾讯云的相关产品中,与C++开发相关的产品包括云服务器CVM、容器服务TKE、函数计算SCF等。这些产品可以为C++开发者提供稳定可靠的云计算基础设施和服务,帮助开发者快速构建和部署应用程序。

更多关于腾讯云产品的信息,可以访问腾讯云官方网站:https://cloud.tencent.com/

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

相关·内容

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

1.再谈构造函数 1.1构造函数体赋值 根据之前介绍内容:在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适初始值,我们之前使用构造函数都叫做函数体内赋初值 class Date...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量初始化构造函数体中语句只能将其称为赋初值,而不能称作初始化。...因为初始化只能初始化一次,而构造函数体内可以多次赋值。 初始化与赋值区别: 初始化是在创建变量时为其赋予一个初始值。在构造函数中,初始化通常是在对象创建时对成员变量进行赋值。...之前函数体内赋值不是用好好嘛,这个干嘛?...但是:为了得到count而特地创建了一个对象调用get函数(还是有点不合适) 对于对象调用成员函数意义:1. 是告诉编译器getCount在A里 2.

41410

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

一、对象作为成员变量时构造函数问题 1、问题描述 如果 一个 A 对象 作为 另外一个 B 成员变量时 , 在以下场景会报错 : 为 A 定义 有参 构造函数 , 那么 A 无参默认构造函数就失效了...; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 在一个中 , 其成员变量是 带有参构造函数 类型 , 这种情况下没有调用 有参构造函数机会 , 此时就会出现 编译报错情况 ; 在下面的代码中...public: int m_age; // 年龄 A m_a; // A 类型成员变量 }; int main() { // 通过 B 默认无参构造函数初始化 B 对象 B b;...是一种用于初始化成员变量方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量 构造函数 初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...初始化列表中元素由 成员变量名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码中 , 为 B 定义了默认构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表中 , m_age

43730

c++数据成员初始化次序

分享一个之前学知识点,感觉还挺重要,就是当一个某个数据成员同时拥有就地初始化构造函数初始化列表和构造函数函数体里赋值,那么它会先执行哪个?最后生效又是哪个呢?...根据老师讲解,数据成员初始化次序依次为: 就地初始化 > 构造函数初始化列表 >构造函数赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函数体里赋值肯定执行,并且生效...,但是就地初始化构造函数初始化列表执行情况是怎样呢?...所以当一个数据成员同时拥有就地初始化初始化列表时,它会忽略就地初始化而执行构造函数初始化列表。...如果到代码中有参构造函数函数体中加上 this->id = 20; ,运行结果会变为: 0 n = 1,id = 1 n = 1,id = 20 可以看到赋值把初始化列表给id初始化值覆盖掉了

79620

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

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

16730

【Kotlin】初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

文章目录 一、主构造函数定义临时变量 二、主构造函数中定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- 在 Kotlin 中 , 可以在 声明 时 在 名后...定义 " 主构造函数 " ; 在 主构造函数 中 , 可以 定义 成员属性 , 并为 成员属性 提供 初始值 ; 在 主构造函数 中 , 可以定义 临时变量 , 临时变量 一般使用 以下划线为开头 名称...---- 在主构造函数中 定义临时变量 , 格式为 : class 名(_临时变量名: 临时变量类型){} 在主构造函数中也可以 定义成员属性 , 格式为 : class 名(var 成员属性名:...---- Kotlin 只允许 在定义时 定义 一个构造函数 , 在其中可以定义 临时变量 , 也可以定义 属性变量 ; 次构造函数 定义在 Kotlin 内部 , 可以定义 多个 次构造函数..., 每个次构造函数都可以有不同参数组合 ; 定义次构造函数后 , 必须调用主构造函数 , 并且为每个主构造函数 参数设置 参数值 ; 次构造函数中可以实现代码逻辑 , 作为主构造函数补充 ; 代码示例

4.7K20

C++核心准则C.48:如果构造函数需要用常数初始化成员,使用初始化器更合适

维护人员怎么才能知道 j 是否是故意没有初始化(尽管这可能是坏主意)呢?怎么知道一种情况将s初始化为“”,而另一种情况初始化为"qqq"是有意而为之呢(这几乎就是一个错误)?...关于 j 问题(忘了初始化某个成员)经常发生在向添加新成员时候。...然而,这种做法缺乏明确性,会导致更多参数被传递,并且在多于一个构造函数存在时导致代码重复,很麻烦。...(简单)所有的构造函数都应该初始化每个成员(可以明确地通过委托构造函数或默认构造函数) (Simple) Default arguments to constructors suggest an in-class...(简单)针对构造函数默认参数使用初始化器可能是更加恰当选择。 ---- 觉得本文有帮助?请分享给更多人。 关注【面向对象思考】轻松学习每一天! 面向对象开发,面向对象思考!

63920

C++从入门到精通——6个默认成员函数构造函数

前言 6个默认成员函数:如果一个中什么成员都没有,简称为空。 空中真的什么都没有吗?并不是,任何在什么都不写时,编译器会自动生成以下6个默认成员函数。...默认成员函数:用户没有显式实现,编译器会生成成员函数称为默认成员函数。 class Date {}; 一、构造函数概念 C++构造函数是一种特殊成员函数,用于创建和初始化对象。...构造函数一个特殊成员函数,名字与名相同,创建类型对象时由编译器自动调用,它会在内存中为对象分配空间,并根据构造函数定义进行对象初始化。...我们可以在构造函数中对成员变量进行赋值或执行其他初始化操作,以确保对象在创建时具有合适初始状态。 使用构造函数可以方便地创建对象并进行初始化操作,提高代码简洁性和可读性。...,代码可以通过编译,因为编译器生成了一个无参默认构造函数 // 将Date构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成 // 无参构造函数,放开后报错:error

10710

C++构造函数初始化列表 ② ( 构造函数初始化列表 传递参数 | 嵌套情况下 构造函数 析构函数 执行顺序 )

, 执行了 A 构造函数 ; B 中还定义了 有参构造函数 , 接收 3 个参数 , 分别作为 m_age 成员值 , 和 A 类型成员对象 有参构造函数 2 个参数 , 这是 使用了...int m_age; // 年龄 A m_a; // A 类型成员变量 }; int main() { // 通过 B 有参构造函数 // 其中 构造函数参数 作为 参数列表 中参数值.../ 析构函数 执行顺序 ---- 1、构造函数 / 析构函数 执行顺序 B 中 定义了 A 类型 成员变量 ; A 类型对象 是 被组合对象 ; 构造函数执行顺序 : 在 初始化 B 类型 实例对象时..., 先执行 被组合对象 A 构造函数 , 如果 被组合对象 有多个 , 则 按照 成员变量 定义顺序 进行初始化 ; 注意 : 此处 不是按照 初始化列表 顺序 进行初始化 ; 析构函数执行顺序...; // A 类型成员变量 }; int main() { // 通过 B 有参构造函数 // 其中 构造函数参数 作为 参数列表 中参数值 B b(10, 10, 150);

18530

C++从入门到精通——6个默认成员函数之拷贝构造函数

拷贝构造函数 前言 一、拷贝构造函数概念 理解 定义 二、拷贝构造函数特征 三、注意要点 写法 实践 前言 6个默认成员函数:如果一个中什么成员都没有,简称为空。 空中真的什么都没有吗?...C++拷贝构造函数是一种特殊构造函数,用于创建对象时,使用一个已有对象内容初始化对象。它接受一个同类对象作为参数,并按照该对象数据成员创建新对象。...拷贝构造函数通常用于以下情况: 在创建对象时,使用同类已有对象初始化新对象。 以值传递方式将对象传递给函数。 以值返回方式从函数返回对象。...拷贝构造函数工作原理是将obj数据成员值复制给新创建对象。这意味着新对象数据成员会与原对象具有相同值,但是它们是独立,改变其中一个对象数据成员值不会影响另一个对象数据成员。...拷贝构造函数通过对象名调用,而不是通过函数调用。 二、拷贝构造函数特征 拷贝构造函数也是特殊成员函数,其特征如下: 拷贝构造函数构造函数一个重载形式。

20310

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

不过希望我对这些知识整理能帮助你更好理解这部分知识。 深究构造函数 构造函数体赋值与初始化 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适初始值。...,拷贝构造函数对于自定义类型成员处理是调用其对应构造函数和拷贝构造函数,其实这也是通过初始化列表调用。...而在这里也留着一个坑。 这个坑就是,当编译器默认生成构造函数处理自定义类型成员变量时,如果该类没有默认构造函数(无参或者全缺省构造函数)时,会编译不通过。...事实上,初始化列表全称叫做构造函数初始化列表,也就是说初始化列表是构造函数一部分,无论时显式还是隐式,成员变量总是需要初始化,这是一个对象创建必经步骤。...,以及尽可能避免使用成员初始化其他成员

36020

C++】运算符重载案例 - 字符串 ③ ( 重载 左移 << 运算符 | 自定义使用技巧 | 直接访问私有指针成员 | 为指针分配指定大小内存并初始化 0 )

一、重载 左移 << 运算符 1、左移 << 运算符作用 左移运算符重载 , 可参考 【C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 / 成员函数 实现运算符重载 | 对象 使用 左移运算符...- 1、直接访问私有指针成员 在开发中 , 自定义了一个 class , 其中定义了 指针 类型 成员变量 ; 一般情况下 , 成员变量 都要 声明为 私有 private ; 如果要 直接是使用...私有的指针变量 , 可以通过 public 函数获取 私有成员 ; class String { public: // 获取私有成员 char* m_p char* str() { return...在 有参构造函数 中 , 接收 int 类型参数 , 该参数表示字符串大小 ; 如果 参数 为 0 , 则创建一个空字符串 , 指针指向内存空间大小为 1 , 只存放一个 ‘\0’ 字符 , 表示字符串结尾...std; // 导入自定义 String #include "String.h" int main() { // 调用无参构造函数 String s1; // 调用有参构造函数

13810

C++】泛型编程 ⑬ ( 模板示例 - 数组模板 | 构造函数和析构函数 声明与实现 | 普通成员函数 声明与实现 | 外部友元函数 声明与实现 )

一、模板示例 - 数组模板 1、需求分析 模板 作用就是 令 算法 和 数据类型分离 ; 本篇博客中 开始 使用 模板 开发一个 数组 , 数组 中 可以维护 不同类型 元素数据 , 如...: int , char , 自定义 ; 数组 模板 中 , 需要开发要素如下 : 构造函数 , 初始化 数组数据 ; 拷贝构造函数 , 根据一个现有的 数组模板对象 , 创建一个 实例对象...cout << " 调用析构函数 " << endl; } 3、普通成员函数 声明与实现 重载 数组下标 [] 操作符 , 使用 模板内部 成员函数即可完成 ; 普通成员函数 声明 : 数组下标...运算符 重载 , 返回值是一个 T 类型 数据 引用 ; 数组下标 操作符 只有一个 操作数 , 就是 数组 下标 , int 类型值 ; template class...Array { public: // 数组下标 [] 操作符重载 // 数组元素类型是 T 类型 T& operator[](int i); } 普通成员函数 实现 : 模板 外部 实现

32410

C++C++ this 指针用法 ③ ( 全局函数成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

一、全局函数成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加参数是 对象本身指针 ; 在 Student 中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...Student* pThis 在 列表开始位置 ; 详细代码 , 参考最后完整代码示例 ; 2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 全局函数转为成员函数 , 需要隐藏一个参数..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身成员 ; 在全局函数中 , 实现两个 Student 相加 , 接收两个...; 如下带参数构造函数 , 并且为其 有参构造函数 参数 设置一个默认值 , 此时就可以使用 名 对象名 方式定义对象变量 ; class Student { public: // 带参构造函数

16220

C++】继承 ⑥ ( 继承中构造函数和析构函数 | 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 为 父对象 进行初始化 )

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父 : 需要 基 ( 父 ) 对象...地方 , 都可以使用 " 公有继承 " 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外 所有 成员变量 和 成员方法 ; 功能完整性 :..." 私有继承 " 派生 , 是 不具有 基 完整功能 , 因为 最终继承 后派生 , 无法在 外部调用 父 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...指向 子类对象 定义 一个子类对象 Child child ; 定义父指针 , 将 指针 指向 子类对象 地址 , 这是合法 ; 代码示例 : // 父对象 Parent parent...// 通过指针调用父函数 p_parent->funParent(); // 将指向子类对象指针传给接收父指针函数 // 也是可以 fun_pointer

20720

C++雾中风景6:拷贝构造函数与赋值函数

拷贝构造函数,顾名思义,是一个构造函数,但是它特殊点就在于在创建对象时,是使用同一中之前创建对象初始化新创建对象。...我们知道每个都会有构造函数,在对象初始化过程之中,拷贝构造函数提供了一个通过一个同类型对象对它进行初始化。...C++支持两种初始化形式:拷贝初始化(int a = 5;)和直接初始化(int a(5);)对于其他类型没有什么区别,对于类型直接初始化直接调用实参匹配构造函数,拷贝初始化总是调用拷贝构造函数,也就是说...: A x(2);   //直接初始化,调用构造函数 A y = x;  //复制初始化,调用拷贝构造函数C++中,下面几个场景中,拷贝构造函数会被调用: 一个对象需要通过一个对象进行初始化 一个对象以值传递方式作为参数传入函数...既然C++编译器会自动生成拷贝构造函数,为什么我们又需要显式去定义它呢? 因为由C++编译器提供拷贝构造函数工作方式是浅拷贝。它单纯使用了=操作符拷贝类中成员

58820

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

型 void fun(const int& i){ //... } 考虑情况 const成员变量:不能在定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数...虚函数通过函数实现,而指向虚函数指针也需要在对象实例化后创建,那么就违背了先实例化后调用准则。 21、常量指针和指针常量区别? 常量指针是一个指针,读成常量指针,指向一个只读变量。...,所以加上virtual没有任何实际意义;静态成员函数没有this指针,虚函数实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用,所以不能为virtual;虚函数调用关系,this...C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行特定操作,并非简单地分配内存...所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化

1.8K20

硬钢百度面试!

带有虚函数C++大小不为1,因为每一个对象会有一个vptr指向虚函数表,具体大小根据指针大小确定; C++中要求对于每个实例都必须有独一无二地址,那么编译器自动为空分配一个字节大小,这样便保证了每个实例均有独一无二内存地址...问题出来了,如果构造函数是虚,就需要通过 vtable调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。...而构造函数是在创建对象时自动调用,不可能通过指针或者引用去调用,因此也就规定构造函数不能是虚函数。...定义时要分配空间,不能在声明中初始化,必须在定义体外部初始化初始化时不需要标示为static;可以被非static成员函数任意访问。...考虑情况 const成员变量:不能在定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员值可以不同,所以不能在中声明时初始化

16020

c++和对象(四)深入了解拷贝构造函数

对于涉及动态分配内存或其他资源,可能需要进行深拷贝 下面探讨上述Date实现 class Date { public: Date(int year = 1, int month = 1,...拷贝 Date 对象:当 Date d2(d1); 执行时,d2 是通过拷贝构造函数初始化。因为 Date 没有显式定义拷贝构造函数,编译器会为它生成一个默认拷贝构造函数。...这就是自定义类型成员在 Date 拷贝过程中构造函数调用情况,其他基本类型成员变量则是通过简单值复制初始化 在编译器生成默认拷贝构造函数中,内置类型是按照字节方式直接拷贝,而自定义类型是调用其拷贝构造函数完成拷贝...,编译器默认提供,我们来看运行结果: 程序崩溃,我们进行调试观察 当通过 Stack s2(s1); 这样语句创建一个 Stack 对象时,如果没有显式定义拷贝构造函数C++ 编译器会提供一个默认拷贝构造函数...C++ 默认拷贝构造函数会逐个复制成员,使用各成员自己拷贝构造函数

7410

C++构造函数 | 构造函数

C++对象初始化 C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它值是不可预知,因为在系统为它分配内存时,保留了这些存储单元原状,这就成为了这些数据成员初始值,在C...C++数据成员是不能在声明初始化,如果一个中所有的成员都是公用,则可以在定义对象时对数据成员进行初始化。...C++构造函数作用 C++提供了构造函数来处理对象初始化构造函数是一 种特殊成员函数,与其他成员函数不同,不需要程序员调用它,而是在建立对象时自动执行。...在构造函数函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。...如果用户自己没有定义构造函数,则C++编译系统会自动生成一个构造函数,只是这个构造函数函数体是空,也没有参数,不执行初始化操作。

2.1K74

C++从入门到精通——static成员

A,该类包含一个私有的静态成员变量_scount,一个默认构造函数一个拷贝构造函数一个析构函数。...静态成员函数可以调用非静态成员函数,但需要通过对象或者指针调用。...但可以通过将对象作为参数传递进来或者通过对象指针调用非静态成员函数。 非静态成员函数可以调用静态成员函数吗 非静态成员函数可以调用静态成员函数。...其中一个原因是缺省值是要走初始化列表,而static是不会走初始化列表。 除此之外,因为静态成员变量在编译阶段就已经被分配了内存空间(即在静态区),并没有被放置在对象内存空间中。...静态函数属于而不是对象,无需创建对象实例,只能访问静态成员变量和调用其他静态函数。 四、练习题 提示:使用本文所提到静态函数和静态变量解决 JZ64 求1+2+3+…+n

9810
领券