`
bcyy
  • 浏览: 1881125 次
文章分类
社区版块
存档分类
最新评论

C++类初始化 构造函数 笔记

 
阅读更多

当我们定义了构造函数之后,原有的默认构造函数就不可用了。但是拷贝构造函数还是可用的。

当然我们也可以显式禁止拷贝构造函数。

我们也可以自己定义默认构造函数,可以不带参数就构造一个类对象。

class String {
public:
String(const char∗ p = ""); // default constructor : empty string
// ...
};
String s1; // OK
String s2 {}; // OK

s1不带任何参数也是OK的。因为默认构造函数String(const char p = "") 已经带了默认参数""了。

模板类:

template<class T>
struct Handle {
T∗ p;
Handle(T∗ pp = new T{}) :p{pp} { }
// ...
};
Handle<int> px; // will generate int{}; px == 0

什么时候应该要定义默认构造函数呢?

1 必须情况!当我们需要使用这个类在数组当中,如下:

struct S1 { S1(); }; // has default constructor
struct S2 { S2(string); }; // no default constructor
S1 a1[10]; // OK: 10 default elements
S2 a2[10]; // error : cannot initialize elements
S2 a3[] { "alpha", "beta" }; // OK: two elements: S2{"alpha"}, S2{"beta"}
vector<S1> v1(10); // OK: 10 default elements
vector<S2> v2(10); // error : cannot initialize elements
vector<S2> v3 { "alpha", "beta" }; // OK: two elements: S2{"alpha"}, S2{"beta"}
vector<S2> v2(10,""); // OK: 10 elements each initialized to S2{""}
vector<S2> v4; // OK: no elements

或者我们需要隐藏构造函数的时候,例如单一模式(singleton)的时候需要这么做。


2 我们认为默认值有道理的时候,如数字值为0,字符串为""。但是如栈的数据类型就不应该带默认值了。

reference:

The C++ Programming Language by Bejarne

分享到:
评论

相关推荐

    mfc c++视频笔记

    每个类都必须创建一个构造函数,没有的话,就不能创建对象,如果没有定义构造函数,编译器会默认提供不带任何参数的构造函数,他只负责创建对象,不会进行任何的初始化工作。只要一个类定义了一个构造函数,不管这个...

    千锋C++笔记.zip

    4. **构造与析构函数**:构造函数在对象创建时自动调用,用于初始化成员变量;析构函数在对象生命周期结束时调用,用于清理资源。 5. **封装**:封装是面向对象的三大特性之一,通过访问修饰符(public、private、...

    《C++20设计模式》学习笔记-第2章构造器模式学习代码

    "parameter_constructor.hpp"可能包含了参数化构造函数的实现,这是一种接受参数并根据参数值来初始化对象的构造函数。这种类型的构造函数在需要根据多种条件创建不同状态的对象时非常有用。文件可能定义了不同参数...

    c++学习笔记.pdf

    构造函数是在创建对象时自动调用的特殊成员函数,用于初始化对象的成员变量。 3. 结构体内存对齐是C++中为了提高内存存取效率而采取的一种内存分配策略。编译器会根据处理器的存取方式和数据类型自动插入填充字节,...

    C++基础C++相关笔记总结

    构造函数是类的一个特殊成员函数,用于初始化对象。每个类至少有一个构造函数,如果没有显式定义,则编译器会自动提供一个默认构造函数。构造函数可以是无参的,也可以接受参数来初始化对象的属性。C++还支持拷贝...

    二级C++笔记.docx

    在 C++ 中,私有成员只能声明不能初始化。私有成员是类的内部实现细节,外部不能直接访问。 6. 不可重载的运算符: 在 C++ 中,有五个运算符不能被重载,这五个运算符分别是 .、*、::、?: 和 sizeof。这些运算符...

    effective c++笔记1

    本笔记总结了Effective C++的第1到第11条款,涵盖了C++语言的多个方面,包括构造函数、拷贝构造函数、拷贝赋值函数、const关键字、enum、inline函数、定义域、static变量、初始化、编译器生成的函数、拷贝控制、多态...

    自考C++笔记(上)

    C++中利用构造函数语法实现初始化,如: Int z(0); //等同于 int z=0; #### 1.6 函数原型及其返回值 C++使用变量和函数的基本规则都是:先声明,后使用。变量有时也可边声明边使用,但必须声明,否则出错...

    C++学习笔记

    4. **成员的初始化**:类中的私有成员需要通过公有方法或者构造函数进行初始化。 #### 四、构造函数与析构函数 1. **构造函数**: - 构造函数用于初始化新创建的对象。 - 构造函数没有返回值,也不能有`void`...

    C++编程惯用法笔记.doc

    1. **构造函数**是类的重要组成部分,它的主要职责是初始化对象。除了函数体内的代码,构造函数还负责初始化基类和数据成员。在函数参数传递和赋值操作中,会隐式调用构造函数和复制构造函数。 2. **复制构造函数**...

    《C++ Primer》学习笔记(24)类

    - **默认构造函数的作用**:默认构造函数在多种情况下会被自动调用,例如在未初始化的非静态局部变量、类中合成的默认构造函数成员等场合。此外,当没有提供完整的数组初始化时,默认构造函数也会被调用。 - **隐式...

    c++学习笔记(个人学习时做的笔记)

    8. **构造函数初始化列表**:构造函数初始化列表用于设置对象初始化时的数据成员的初始值。 9. **成员初始化次序**:成员的初始化顺序由它们在类定义中的顺序决定,与初始化列表中的顺序无关。 ### 类与容器 1. *...

    深入C++对象模型的读书笔记

    - 拷贝构造函数使用成员初始化列表,确保在多态环境下正确指向基类的虚函数表,而赋值运算符没有这个列表,可能导致指针错误。 5. **非默认构造函数的影响**: - 如果基类没有默认构造函数,但有其他构造函数,...

    C++笔记.rar C++笔记.rar

    对象是类的实例,通过构造函数初始化,可以调用类中的成员函数进行操作。 3. **继承与多态**:C++支持单一继承和多重继承,子类可以继承父类的属性和方法,实现代码复用。多态性主要通过虚函数和纯虚函数实现,允许...

    C++自考笔记(下)

    - **构造函数**:派生类的构造函数可以调用基类的构造函数,通过成员初始化列表来初始化基类成员。例如: ```cpp 派生类名::派生类名(参数表 0) : 基类名(参数表) { // 函数体 } ``` - **析构函数**:派生类...

    Inside C++ Object Model 读书笔记(暂时第二章)

    在这些情况下,如果已声明默认构造函数,编译器合成的代码(包括基类或成员构造函数的初始化、vtable和vptr)将插入到已声明的任何默认构造函数中。同样的逻辑也适用于复制构造函数,即默认合成的复制构造函数会包含...

    C++服务器开发精髓笔记

    本笔记涵盖了C++服务器开发的精髓知识点,从RAII到Pimpl、C++11新特性、统一的类成员初始化语法、std::initializer_list、C++17注解标签等多方面内容。 1. RAII(Resource Acquisition Is Initialization) RAII是...

    c++笔记.txt

    `a`和`r`都是常量成员变量,其中`a`是在构造函数中初始化的,而`r`是引用类型的常量成员,指向`a`。 ### 条件编译指令 条件编译指令允许程序员根据不同的条件编译代码的不同部分。 #### 示例 1. `#if`与`#endif` ...

Global site tag (gtag.js) - Google Analytics