首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏C++核心准则原文翻译

    C++核心准则C.45:使用初始化初始化数据成员

    default constructor that only initializes data members; use in-class member initializers instead C.45:不要只初始化数据成员的默认构造函数 ;使用成员初始化器 Reason(原因) Using in-class member initializers lets the compiler generate the function 使用初始化器可以让编译器为你生成一个函数。编译器生成的函数效率更高。 string s; int i; public: X1() :s{"default"}, i{1} { } // ... }; Example(示例) class X2 (简单)默认构造函数应该比使用常量初始化数据成员做的更多。 译者注:差不多就是杀鸡焉用牛刀的意思。

    79800发布于 2020-03-25
  • 来自专栏零域Blog

    C++ 成员变量初始化

    本文是对《Effective C++》的”Item 4: Make sure that objects are initialized before they’re used”的笔记和验证。 结论 在进入构造函数体之前,数据成员的初始化就已完成。 数据成员的初始化顺序取决于声明顺序。 而进入函数体之前的数据成员的初始化如何控制呢?答案就是——成员初始化列表。 结论 2 证明 证明代码片段: #include <stdio.h> class CA { public: CA(const char* pName = "default") { ,对成员的初始化还是以声明顺序为依据。

    1.4K20编辑于 2022-03-08
  • 来自专栏闷骚的程序员

    C++ 成员变量初始化

    本文是对《Effective C++》的”Item 4: Make sure that objects are initialized before they’re used”的笔记和验证。 结论 在进入构造函数体之前,数据成员的初始化就已完成。 数据成员的初始化顺序取决于声明顺序。 而进入函数体之前的数据成员的初始化如何控制呢?答案就是——成员初始化列表。 结论 2 证明 证明代码片段: #include <stdio.h> class CA { public: CA(const char* pName = "default") { ,对成员的初始化还是以声明顺序为依据。

    2.8K10发布于 2020-04-14
  • 来自专栏C语言及其他语言

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

    上面的构造函数(使用初始化列表的构造函数)显式的初始化的成员;而没使用初始化列表的构造函数是对的成员赋值,并没有进行显式的初始化初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数: ? 1.成员类型是没有默认构造函数的。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若没有默认构造函数,则编译器尝试使用默认构造函数将会失败。 2.const 成员或引用类型的成员。 1.内置数据类型,复合类型(指针,引用)- 在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的 2.用户定义类型(类型)- 结果上相同,但是性能上存在很大的差别。 初始化列表的成员初始化顺序: C++ 初始化成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。 ?

    2.5K20发布于 2019-11-22
  • C++和对象之初始化列表

    C++初始化列表详解:性能优化与正确实践 在C++编程中,初始化列表是构造函数的重要组成部分,它不仅能提升代码性能,还能确保成员变量被正确初始化。本文将深入探讨初始化列表的语法、应用场景及最佳实践。 基初始化:正确调用父构造函数 当基没有默认构造函数时,必须通过初始化列表显式调用其带参构造函数。 . */ } // 调用基构造函数 }; 4.必须使用初始化列表的情况 在C++中,引用、const成员变量以及没有默认构造函数的类型成员变量必须在构造函数初始化列表中进行初始化,这是由它们的语义和 C++对象生命周期的规则决定的。 ) : b(value), a(b) {} // a先被初始化,但此时b未初始化 }; 2.

    21310编辑于 2026-01-15
  • 来自专栏C++核心准则原文翻译

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

    ,使用初始化器更合适 Reason(原因) Makes it explicit that the same value is expected to be used in all constructors 维护人员怎么才能知道 j 是否是故意没有初始化(尽管这可能是坏主意)呢?怎么知道一种情况将s初始化为“”,而另一种情况初始化为"qqq"是有意而为之呢(这几乎就是一个错误)? 关于 j 的问题(忘了初始化某个成员)经常发生在向添加新成员的时候。 Example(示例) class X2 { int i {666}; string s {"qqq"}; int j {0}; public: X2() = default (简单)针对构造函数的默认参数使用初始化器可能是更加恰当的选择。 ---- 觉得本文有帮助?请分享给更多人。 关注【面向对象思考】轻松学习每一天! 面向对象开发,面向对象思考!

    86720发布于 2020-03-25
  • 来自专栏学习成长指南

    C++和对象(2

    的说明 (1)我们通过自己的打印输出也可以看出来,这个时候是不能打印输出age,address的,因为他们不像public里面的name,他们一个是被保护的,一个是私有的,因此我们无法直接进行访问; 2. 设计一个通常的规范:变量私有,函数公有 通过这个例子,我们应该了解到一些基本的代码风格,函数是公开的,变量是私有的,这个可以提高我们的代码的安全性;这个里面我们还自定义了一个新的函数对年龄进行加加操作 指针指向语句里面的当前对象 这个例子,我们一起认识一下this的用法,以及实用的场景; 这个我们还是自定义了一个函数,只不过这个函数需要我们传递参数,我们就把参数设置为name,因为参数的名字,和我们在里面定义的变量的名字是一样的 门成绩,这样的成员函数只能够处理这样的一个成员变量; (3)如果我们想要计算3个人同一门科目的平均分,就不能使用这样的成员函数,因为这样涉及多个成员变量,这个时候我们需要独立的外部函数指的就是我们需要在定义的外面新定义函数 就相当于使用数组表示原来的s1,s2,s3,s4; (3)这个里面调用setstudent函数的时候,对变量进行初始化,调用getaverage3这个函数的时候,就去找到我们外部定义的函数getaverage3

    6700编辑于 2025-02-24
  • 来自专栏C/C++、数据结构、算法

    C++与对象(2

    一、六大默认成员函数 C++为了弥补C语言的不足,设置了6个默认成员函数 二、构造函数 2.1 概念        在我们学习数据结构的时候,我们总是要在使用一个对象前进行初始化,这似乎已经成为了一件无法改变的事情 2.2 特性 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。 其特征如下: 特性1. 函数名与名相同。 特性2. (即一个可以有多种构造函数,也就是多种初始化方式) 思考:  1、为什么调用无参构造不加个括号呢??总感觉很奇怪?? 答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据 型,如:int/char... 2、内置类型的初始化一般怎么处理? 答:由于编译器不会处理,所以有两种思路:1、自己写构造函数,根据该类的特定去初始化其内置类型成员。

    34210编辑于 2024-02-28
  • C++——和对象(2

    的默认成员函数分类 在 C++ 中,当你定义一个(class 或 struct)时,编译器会自动为你生成一些你没有显式(手动)定义的成员函数。 构造函数的本质就是要替代之前中的初始化函数(Init)的功能,构造函数自动调用的特点就完美的替代的了Init。 构造函数的特点: 函数名就是名 无返回值(返回值什么都不需要给,也不需要写void,C++规定) 实例化对象时会自动调用对应的构造函数 如果类中没有显示的定义构造函数,则C++编译器会自动生成一个无参的默认构造函数 Stack的默认构造函数,实现对自定义类型成员变量的初始化 // 如果Stack中没有默认构造,那么就必须用初始化列表初始化 private: // int i; // 内置类型,编译器默认生成的构造函数对它是否初始化不确定 5.1 运算符重载 运算符重载的特点: 当运算符被用于类型的对象时,C++语言允许我们通过运算符重载的形式指定新的含义。

    23310编辑于 2025-10-13
  • C++ 与对象(2

    接着上一章,这一次我将继续介绍C++与对象的知识: 1.的默认成员函数 用户没有显式实现,编译器自动生成的成员函数,即默认成员函数。 构造函数的本质就是代替我们以前具有初始化功能的函数 Init,比如栈Stack,日期Date中的Init函数,构造函数自动调用的特点完美替代的了 Init。 当运算符被用于类型的对象时,C++语言允许我们通过运算符重载的形式为自定义类型(或结构体)重新定义运算符行为。 访问并且调用了这个函数,以实现d1 - d2; 第二种则是直接相减,d1 - d2 ,编译器会把这句表达式,按照C++标准规定的语法逻辑 翻译成 d1.operator-(d2) ,也就是显式调用, 其参数建议设为const当前类型的引用,否则会传值传参,发生拷贝 2.有返回值,且建议写成当前类型的引用。

    14310编辑于 2025-12-20
  • 来自专栏技术分享

    C++】— 和对象(2

    1.的默认成员函数 默认成员函数是用户没有显示的写而编译器自动生成的函数,一个,我们不写编译器会默认生成6个默认成员函数。 2.构造函数 构造函数是特殊的成员函数。 构造函数的特点: (1)函数名与名相同 (2)没有返回值 (3)对象实例化时系统会自动调用对应的构造函数 (4)构造函数可以重载 (5)如果没有显示定义构造函数,编译器会自动生成一个无参的构造函数 要初始化这个成员变量就要用初始化列表来初始化。 } 5.赋值运算符重载 5.1 运算符重载 当运算符被用到类型对象时,C++允许我们用运算符进行重载的形式指定新的定义。 C++规定当类型使用运算符时必须对运算符进行重载。若没有运算符重载,编译器就会报错。 运算符重载是具有特殊名字的函数,由operator和后面要定义的运算符共同构成。

    22410编辑于 2024-10-21
  • 来自专栏六月-游戏开发

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

    分享一个之前学的知识点,感觉还挺重要的,就是当一个中的某个数据成员同时拥有就地初始化、构造函数初始化列表和构造函数函数体里的赋值,那么它会先执行哪个?最后生效的又是哪个呢? 根据老师的讲解,数据成员的初始化次序依次为: 就地初始化 > 构造函数的初始化列表 >构造函数里的赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函的函数体里的赋值肯定执行,并且生效 STU s1{}; //调用无参构造 cout << "n = " << n << ",id = " << s1.getId()<< endl; STU s<em>2</em>{ 10}; cout << "n = " << n << ",id = " << s<em>2</em>.getId()<< endl; return 0; } 运行结果为: 0 n = 1,id 所以当一个数据成员同时拥有就地<em>初始化</em>和<em>初始化</em>列表时,它会忽略就地<em>初始化</em>而执行构造函数<em>初始化</em>列表。

    1.4K20编辑于 2022-12-26
  • 来自专栏防止网络攻击

    C++使用new来初始化指向的指针

    C++使用new来初始化的指针 1.ClassName * p = new ClassName; 调用默认构造函数。 如果类里没有写默认构造函数,会使用编译器帮我们生成的,并且会初始化成员变量,比如 int 会被初始化为 0 NoConstructor* p2 = new NoConstructor(); p2->printVal C++指针初始化问题 c++中的指针是一个很经典的用法,但是也是最容易出错的,比如定义了一个指针,必须对其进行初始化,不然这个指针指向的是一个未知的内存地址,后续对其操作的时候,会报错。 下面就总结一下c++指针初始化的一些方法,以及我自己遇到的一些问题以及心得体会。 c++指针初始化的一般方法 1.将一个已经在内存中存在变量的地址传递给定义的指针 这个指针就指向这个变量的内存地址(相同的数据类型),完成初始化

    1.2K20编辑于 2023-10-14
  • 来自专栏就业 C++ 综合学习

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

    在很多初始化和赋值的区别事关底层效率的问题:前者直接初始化数据成员,后者则先初始化再赋值。除了效率问题外更重要的是,一些数据成员必须初始化。 1 ,但是程序实际输出了: 这就是因为初始化顺序的问题了,因为成员_a2在_a1前,所以先对_a2初始化,就造成了随机值。 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化 成员变量在中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。 2 static 静态成员 有时候需要一些成员与本身直接相关,而不是与的各个对象保持联系。 例如,一个银行账户对象可能需要一个数据成员来表示当前基准利率。 = &d1; d2->count(); d1.count(); return 0; } 2.4 定义静态成员 和其他成员函数一样,我们既可以在内部也可以在外部定义。

    82110编辑于 2024-02-25
  • 来自专栏JohnYao的技术分享

    Unreal随笔系列2: 初始化流程&Gameplay基础

    导语 近期排查一个问题时,将Unreal的启动的初始化流程和基础的Gameplay又review了下。 将相关内容整理,随笔记录下来。 在介绍上述流程中的初始化步骤前,我们回顾下: Gameplay的基础 Unreal构建游戏玩法的基础罗列如下。 2. FEngineLoop::Init会首先创建Engine的实例;在Engine初始化过程中会创建GameInstance的实例。 3. 动态初始化和预创建,可以通过对以上流程的理解,安排在合适的时机:比如PostLoadMap,或者放到Tick。 这些定制化的流程,可能带来游戏流程的变化。比如等待这些定制化流程完成的阶段。 结语 本文对Unreal的主程序入口和Gameplay基础做了一定剖析,并详细整理了引擎初始化,和玩家登录后的初始化流程。

    1.7K20编辑于 2023-03-08
  • 来自专栏zxctscl个人专栏

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

    前言 在前面的博客中已经分享有关构造函数 【C++】构造函数和析构函数详解,这次又再一次提到构造函数,一起来看看。 2. 所以c++中用了初始化列表,初始化列表是每个成员变量定义初始化的位置。 下面的成员变量也会走初始化列表,他们也要定义,只是没有给值就是随机值,如果给了值就直接初始化。 这里是显示的调构造 【注意】 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 中包含以下成员,必须放在初始化列表位置进行初始化,不能在函数体内初始化: (1)引用成员变量 到时候初始化列表就直接用2初始化,和上面的原因一样:同一个表达式连续步骤的构造,一般会被合二为一 成员变量在中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。 静态成员变量一定要在外进行初始化。 面试题:实现一个,计算程序中创建出了多少个对象。 就是统计构造,构造函数调用了多少次。

    45610编辑于 2024-03-04
  • 来自专栏Deep learning进阶路

    C++随记(十)--与对象(2

    C++随记(十)--与对象(2) 1、  的构造函数 的数据成员是不能在声明的时候初始化的!因为不是一个实体,是一种抽象类型,并不占存储空间。 C++为我们提供了一个特殊的成员函数---构造函数,专门用于构造新对象,来处理对象的初始化问题。 这个成员函数不需要用户来调用它,而是在建立对象的时候自动执行。 ,它不包含任何参数,一个中只能有一个默认构造函数 Country( int area; int population);//通过函数重载来实现另一个构造函数 … 另外,在定义含参数的构造函数时,可以将它设置为参数初始化列表来对成员进行初始化 这种方法不在函数体内对数据成员进行初始化,而是在函数首部。 2、  析构函数 析构函数的作用与构造函数相反,析构函数并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作。 (2)如果调用的是局部自动对象,则建立对象时调用构造函数。在函数调用结束,对象释放时调用析构函数。

    75400发布于 2017-12-28
  • 来自专栏小樱的经验随笔

    C++课程设计作业2

    不要问我一个晚上在干啥,就写写这种烦到极点的,啰嗦! 1 #include <bits/stdc++.h> 2 using namespace std; 3 class complexed 4 { 5 public: 6 complexed ) 37 { 38 real=r; 39 imag=i; 40 } 41 int main() 42 { 43 complexed c1; 44 complexed c2( 6.8); 45 complexed c3(5.6,7.9); 46 c1.display(); 47 c2.display(); 48 c3.display(); 49 c1=complexed(1.2,3.4); 50 c2=5; 51 c3=complexed(); 52 c1.display(); 53 c2.display

    826110发布于 2018-04-09
  • 来自专栏跟Qt君学编程

    C++初始化

    ❝在C++中int类型可以看作为一个,那么它就有以下的初始化方式。 ❞ int i; /* 默认初始化 */ int i = 0; /* 拷贝初始化 */ int i(0); /* 直接初始化 */ int *i = new int(); /* 值初始化 */ int i{0}; /* 列表初始化 */ std::vector<int> i{1, 2, 3}; /* 列表初始化 */

    38610发布于 2020-04-01
  • 来自专栏C++

    C++和对象——Lesson2

    1、赋值运算符重载 1.1运算符重载 当运算符被用于类型的对象时,C++允许我们通过运算符重载的形式指定新的定义。 C++规定类型对象使用运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编译报错。 如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。 int _a1 = 2; }; int main() { B b(1); b.Print(); return 0; } 因为在B中,先声明的_a2,再声明的_a1,所以在初始化列表中先初始化_ a2,再初始化_a1,初始化_a2的时候_a1还是随机值,然后再用a初始化_a1。

    21810编辑于 2024-10-16
领券