C++的四种构造函数

默认构造函数和初始化构造函数:

拷贝构造函数:复制构造函数用于复制本类的对象。

默认复制构造函数:

Student(Student &b)

{

this.x=b.x;

this.y=b.y;

}

将一个已存在的对象b,赋值给调用该复制构造函数的对象。

在以下情况发生时,会调用复制构造函数:

①:用复制的方法,建立一个新对象。

②:函数的形参为类的对象时。(要复制一份实参给函数)

③:函数的返回值是类的对象,此时将创建一个临时对象,并调用复制构造函数,将返回的内容复制到该临时对象中

转换构造函数:

用于将其他类型的变量,隐式转换为本类对象。

假设重载了+运算符,使得两个student类的对象可以相加,其结果为两个对象的成员变量age之和。

Student s1(01,18);

Student s2(02,20);

s1+s2; //其值就是s1.age + s2.age = 18+20=36。

假设重载了+运算符,使得两个student类的对象可以相加,其结果为两个对象的成员变量age之和。

那如果是S1+19呢,则要将19转化为student类。

 

当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数成为转换构造函数。

class Complex  

{  public:      Complex():real(0),imag(0){};      Complex(double r, double i):real(r),imag(i){};      Complex(double r):real(r),imag(0){};  // 定义转换构造函数        void Print(){          cout<<"real = " << real <<" image = "<<imag<<endl;      }      Complex& operator+(Complex c){          return Complex(this->real + c.real, this->imag + c.imag);           }  private:      double real;      double imag;  

};  

 

 

 

 

 

 

 

 

 

 

 

<think>好的,用户想知道C++四种构造函数的示例代码。首先,我需要回忆C++中的构造函数类型。根据知识库里的引用,特别是引用[2]提到有六种构造函数,但用户问的是四种。可能需要明确常见的四种类型。常见的构造函数包括默认构造函数、参数化构造函数、拷贝构造函数和移动构造函数。不过引用[2]中还提到委托构造函数,但可能用户指的是这四种基本类型。 先确认用户的问题:四种构造函数可能的分类。比如默认构造、参数化构造、拷贝构造、委托构造?或者是否包含移动构造?根据引用[3]中的例子,他们展示了不同的构造函数,包括参数化、拷贝构造,但没有移动构造。不过用户可能需要更基础的分类。 根据引用[4],析构函数的相关知识,但构造函数部分在引用[2]和[3]。例如引用[2]提到委托构造函数C++11的特性,属于其中一种。用户可能想了解默认、参数化、拷贝和委托构造函数四种。需要结合这些信息来生成示例代码。 接下来需要为每种构造函数编写示例。例如: 1. 默认构造函数:无参数,初始化对象。 2. 参数化构造函数:带参数的构造函数。 3. 拷贝构造函数:使用同类对象初始化新对象。 4. 委托构造函数:调用同类中的其他构造函数,减少代码重复。 需要确保代码正确,比如拷贝构造函数的参数应为const引用。同时,析构函数也需要正确编写,如引用[4]中的示例,释放资源。 需要注意用户可能对移动构造函数不太熟悉,但问题只问四种,所以可能不包括移动构造。但需要确认是否用户的需求是否覆盖。根据引用中的信息,用户提供的引用中没有提到移动构造,所以可能暂时不考虑。 然后,编写代码示例。例如: class MyClass { public: // 默认构造函数 MyClass() : data(0) {} // 参数化构造函数 MyClass(int value) : data(value) {} // 拷贝构造函数 MyClass(const MyClass& other) : data(other.data) {} // 委托构造函数,调用参数化构造函数 MyClass(double d) : MyClass(static_cast<int>(d)) {} private: int data; }; 同时,在main函数中创建不同实例,展示构造函数的调用情况。例如: MyClass obj1; // 默认构造 MyClass obj2(10); // 参数化构造 MyClass obj3(obj2); // 拷贝构造 MyClass obj4(3.14); // 委托构造 还需要注意析构函数的调用顺序,如引用[3]中提到的,对象销毁时析构函数按相反顺序调用。 此外,引用[4]中的析构函数示例展示了资源释放,因此在代码示例中可能需要添加析构函数的实现,比如输出信息,方便观察调用过程。 最后,生成相关问题,如性能优化、应用场景等,参考用户提供的示例问题结构。 确保代码符合LaTeX格式要求,行内公式用$,独立公式用$$,但当前问题可能不需要数学公式,重点在代码示例。但如果有涉及数学的地方需要注意格式。</think>### C++ 四种构造函数示例 在 C++ 中,构造函数用于初始化对象。常见的四种构造函数类型包括 **默认构造函数**、**参数化构造函数**、**拷贝构造函数** 和 **委托构造函数**。以下是代码示例: ```cpp #include <iostream> using namespace std; class Example { private: int value; string name; public: // 1. 默认构造函数(无参数) Example() : value(0), name("default") { cout << "默认构造函数调用" << endl; } // 2. 参数化构造函数(带参数) Example(int v, const string& n) : value(v), name(n) { cout << "参数化构造函数调用: " << name << endl; } // 3. 拷贝构造函数(通过同类对象初始化) Example(const Example& other) : value(other.value), name(other.name + "_copy") { cout << "拷贝构造函数调用: " << name << endl; } // 4. 委托构造函数C++11特性,调用参数化构造函数) Example(int v) : Example(v, "delegated") { cout << "委托构造函数调用" << endl; } // 析构函数(用于资源清理) ~Example() { cout << "析构函数调用: " << name << endl; } void print() { cout << "value: " << value << ", name: " << name << endl; } }; int main() { Example obj1; // 调用默认构造函数[^3] Example obj2(10, "obj2"); // 调用参数化构造函数 Example obj3(obj2); // 调用拷贝构造函数 Example obj4(20); // 委托构造函数 → 参数化构造函数[^2] return 0; } ``` #### 代码说明 1. **默认构造函数** 当对象无参数初始化时调用,例如 `Example obj1;`。若未显式定义,编译器会自动生成一个默认构造函数[^4]。 2. **参数化构造函数** 通过传入参数初始化成员变量,例如 `Example obj2(10, "obj2");`。 3. **拷贝构造函数** 通过同类对象初始化新对象,例如 `Example obj3(obj2);`。参数必须为 `const` 引用以避免无限递归[^3]。 4. **委托构造函数** 在构造函数中调用同类其他构造函数C++11 特性),例如 `Example(int v)` 委托给 `Example(int v, string n)`。 5. **析构函数** 对象销毁时自动调用,按创建顺序的逆序执行[^3]。 #### 输出示例 ``` 默认构造函数调用 参数化构造函数调用: obj2 拷贝构造函数调用: obj2_copy 参数化构造函数调用: delegated 委托构造函数调用 析构函数调用: delegated 析构函数调用: obj2_copy 析构函数调用: obj2 析构函数调用: default ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值