C++ 新特性 构造函数

简介: C++ 新特性 构造函数

1.委托构造函数

委托构造函数出现的意义:

委托构造初始化能够减少代码的冗余的问题  使代码变得简洁 明朗

现在大家来看一个例子:

本代码采用了普通函数的构造方法 看起来简洁一些 但是并没有从实际上解决问题 尤其是对于

复杂数据类型的存储 比如String类型 已经发生了默认的构造初始化 所以这里产生了构造初始化的重复问题

拓展 String类型的默认初始化: 在C++中,String类的默认初始化将创建一个空字符串。也就是说,当声明一个String对象但没有给它赋初值时,它将自动初始化为空字符串。

委托构造函数的格式 代码实例:

#include <iostream>
class MyClass {
private:
    int value1;
    int value2;
public:
    MyClass() : MyClass(0, 0) {} // 委托构造函数
    MyClass(int v1, int v2) : value1(v1), value2(v2) {}
    void printValues() {
        std::cout << "value1: " << value1 << ", value2: " << value2 << std::endl;
    }
};
int main() {
    MyClass obj; // 调用默认构造函数,也就是委托给另一个构造函数
    obj.printValues(); // 输出:value1: 0, value2: 0
    return 0;
}

本代码就是Myclass()为委托构造函数  MyClass(int v1, int v2) : value1(v1), value2(v2) {}为代理构造函数  委托构造函数采用初始化列表的方式调用代理构造函数 (注意只能用初始化列表的形式 使用函数体内部调用会报错)

执行顺序 先执行代理构造函数的 初始化列表 然后再执行代理构造函数的结构体 最后执行委托构造函数主体

委托构造函数注意事项:

1.每个构造函数都可以委托另一个构造函数代为代理

2.不要递归循环委托

3.代理构造函数执行完成后 委托构造函数的主体出现了异常 则自动调用该类型的析构函数

4.如果一个函数为委托构造函数 那么其初始化列表里就不能对数据成员和基类进行初始化

委托构造函数应用:

class Person {
public:
    Person() : Person("", 0) { } // 默认构造函数委托给带参数的构造函数
    Person(const std::string& name, int age) 
        : name(name), age(age), address("") { } // 带参数的构造函数
    Person(const std::string& name, int age, const std::string& address)
        : name(name), age(age), address(address) { } // 带参数的构造函数
private:
    std::string name;
    int age;
    std::string address;
};

委托模板构造函数代码示例:

template <typename T>
class Vector {
public:
    Vector() : Vector(0) { } // 默认构造函数委托给带参数的构造函数
    explicit Vector(size_t size)
        : size_(size), data_(new T[size]) { }
    template <typename U>
    Vector(const Vector<U>& other)
        : size_(other.size()), data_(new T[other.size()]) {
        for (size_t i = 0; i < size_; ++i) {
            data_[i] = static_cast<T>(other[i]);
        }
    }
private:
    size_t size_;
    T* data_;
};

2.继承构造函数

在普通的类和对象中 普通的父类的构造函数是不会继承的 只有父类的无参构造函数才是可以系统默认调用的 而其他的构造函数都需要手写代码来显示调用父类的构造函数 我们需要编译器来帮助我们生成简单代码(想着办法偷懒)

语法规则 核心是使用using关键字

代码示例:

class Parent {
public:
    Parent(int value) { /* 父类构造函数 */ }
};
class Child : public Parent {
public:
    using Parent::Parent;  // 继承父类的构造函数
    // 可以添加子类特有的成员和方法
};

于C++11及更高版本,可以使用using关键字来实现继承构造函数。这个特性叫做“继承构造函数”。

通过使用using关键字,子类可以将父类的构造函数引入到子类作用域中,从而实现调用父类构造函数。

在上面的示例中,子类 Child 使用 using Parent::Parent 的方式将父类 Parent 的构造函数引入到子类作用域中。这样,在创建子类对象时,就可以直接使用父类的相应构造函数进行初始化。

需要注意的是,如果父类有多个重载的构造函数,在使用继承构造函数时需要根据需要选择合适的基类构造函数进行引入。

继承构造函数能够简化代码并提高可读性,避免了手动编写委派构造函数的繁琐过程。

好啦 本篇介绍构造函数的内容就到这里啦

在这里小编想推荐一个课程

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
|
2月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
125 59
|
22天前
|
安全 编译器 C++
【C++11】新特性
`C++11`是2011年发布的`C++`重要版本,引入了约140个新特性和600个缺陷修复。其中,列表初始化(List Initialization)提供了一种更统一、更灵活和更安全的初始化方式,支持内置类型和满足特定条件的自定义类型。此外,`C++11`还引入了`auto`关键字用于自动类型推导,简化了复杂类型的声明,提高了代码的可读性和可维护性。`decltype`则用于根据表达式推导类型,增强了编译时类型检查的能力,特别适用于模板和泛型编程。
22 2
|
26天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
66 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
70 4
|
2月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
24 1
|
2月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
41 0
|
2月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
22 0