C++11 引入的新的构造函数和语言特性

type right by Thomas Alan 光风霁月023 .XDU

1. 默认构造函数:

没有任何参数的构造函数,可以用于创建对象。例如:

class MyClass {
public:
    MyClass() {
        std::cout << "Default constructor called" << std::endl;
    }
};

int main() {
    MyClass obj;  // 调用默认构造函数
    return 0;
}

2. 带有默认值的构造函数:

可以为构造函数的参数提供默认值,用于简化构造函数的调用。例如:

class MyClass {
public:
    MyClass(int x = 0, int y = 0) : m_x(x), m_y(y) {
        std::cout << "Constructor called with x = " << m_x << ", y = " << m_y << std::endl;
    }
private:
    int m_x;
    int m_y;
};

int main() {
    MyClass obj1;         // 调用默认构造函数,x和y都使用默认值0
    MyClass obj2(1);      // 调用构造函数,x = 1,y使用默认值0
    MyClass obj3(2, 3);   // 调用构造函数,x = 2,y = 3
    return 0;
}

3. 拷贝构造函数:

用于在创建对象时从另一个同类型对象中拷贝初始化新对象。例如:

class MyClass {
public:
    MyClass(int x) : m_x(x) {
        std::cout << "Constructor called with x = " << m_x << std::endl;
    }
    MyClass(const MyClass& other) : m_x(other.m_x) {
        std::cout << "Copy constructor called with x = " << m_x << std::endl;
    }
private:
    int m_x;
};

int main() {
    MyClass obj1(1);          // 调用构造函数,x = 1
    MyClass obj2 = obj1;      // 调用拷贝构造函数,从obj1拷贝初始化obj2
    return 0;
}

4. 移动构造函数:

用于从一个右值对象中“窃取”资源,用于提高程序的性能。例如:

class MyClass {
public:
    MyClass(int* ptr) : m_ptr(ptr) {
        std::cout << "Constructor called with ptr = " << m_ptr << std::endl;
    }
    MyClass(MyClass&& other) : m_ptr(other.m_ptr) {
        other.m_ptr = nullptr;
        std::cout << "Move constructor called with ptr = " << m_ptr << std::endl;
    }
private:
    int* m_ptr;
};

int main() {
    int* ptr = new int(42);
    MyClass obj1(ptr);          // 调用构造函数,ptr = 0x12345678
    MyClass obj2(std::move(obj1));  // 调用移动构造函数,ptr = 0x12345678
    return 0;
}

5. 委托构造函数(Delegating Constructor):

一个构造函数可以调用同一个类的其他构造函数来完成自己的初始化过程,这个被调用的构造函数被称为委托构造函数。委托构造函数可以使用初始化列表或函数体来初始化成员变量。

class Person {
public:
    Person() : name(""), age(0) {}
    Person(string name) : Person() { // 委托构造函数
        this->name = name;
    }
    Person(string name, int age) : Person(name) { // 委托构造函数
        this->age = age;
    }
private:
    string name;
    int age;
};

6. 显式默认构造函数(Explicit Default Constructor):

在C++11中,可以使用default关键字显式地声明默认构造函数,而不必定义其函数体。此时,该构造函数将被隐式定义为默认构造函数。

class Person {
public:
    explicit Person() = default; // 显式默认构造函数
private:
    string name;
    int age;
};

7. 显式析构函数(Explicit Destructor):

与显式默认构造函数类似,显式析构函数的声明也使用default关键字,不必定义函数体。显式声明析构函数的主要目的是禁用编译器自动生成的析构函数。

class Person {
public:
    ~Person() = default; // 显式析构函数
private:
    string name;
    int age;
};

8. Delegating Constructor(委托构造函数):

一个构造函数调用同一个类中的另一个构造函数完成初始化过程。

class Foo {
public:
  Foo() : Foo(0) {}
  Foo(int x) : x_(x) {}
private:
  int x_;
};

9. Explicit Conversion Operator(显式转换运算符):

用于类型转换的函数,只能显式调用。

class Bar {
public:
  explicit operator int() const {
    return 42;
  }
};

10. Deleted Function(删除函数):

使用 =delete 标记的函数,在编译时会报错,无法调用。

public:
  void doSomething() = delete;
};

11. Raw String Literals(原始字符串字面量):

用于包含任意文本内容的字符串字面量,不需要转义特殊字符。

const char* str = R"(Hello, "world"!)";

12. User-defined Literals(用户自定义字面量):

用于自定义字面量的标记,可用于扩展 C++ 内置字面量的类型和值。

constexpr long double operator "" _deg (long double deg) {
    return deg * 3.141592 / 180;
}

double angle = 45.0_deg;

这些是 C++11 引入的一些新的构造函数和语言特性。它们可以使得 C++ 代码更加简洁、高效、易读,也可以提高代码的可靠性和安全性。

你可能感兴趣的:(C++11 引入的新的构造函数和语言特性)