C++构造函数的调用

文章详细介绍了构造函数和析构函数的概念,包括它们的语法特性,如构造函数的有参、无参及拷贝构造,析构函数的唯一性。同时,提到了构造函数的调用方式,如括号法、显示法和隐式转换法,并强调了拷贝构造的调用顺序和规则。此外,还指出C++中关于构造函数和拷贝构造函数的默认行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 对象特性

  • 构造函数和析构函数

构造函数

  • 没有回值也不写void

  • 函数值和类名相同

  • 构造函数可以有参数,因此可以发生重载

  • 程序在调用对象的时候自动调用构造,无须手动调用,只能调用一次

析构函数语法

  • 析构函数,没有返回值也不写void

  • 函数名和类名也相同,在名称前加上符号~

  • 析构函数不可以有参数,因此不可以发生重载

  • 程序在对象销毁前会自动调用析构,无须手动调用,而且只能化调用一次

构造函数的分类及其调用

  • 按参数分为:有参构造和无参构造

  • 按类型分为:普通构造和拷贝构造

  • class person
    {
      public:
    //拷贝构造函数
    person(const person &p)//拷贝的函数不能更改值,也就是在里面在传入一个值
    {
    m_age=p.age;
    }
    int m_age;
    };


- 三种调用的方式

- 括号法

- ~~~
int main()
{
  person p1;//默认构造函数的调用,注意不要加()因为系统会认为是声明
  person p2(10);//有参构造函数
  person p3(p2);//拷贝构造函数
}

  • 显示法

  • person p1;

  • person P2=person (10);//有参构造

  • person p3=person(p2);//拷贝构造

  • person(10);//这是匿名对象,特点当前执行结束后,系统会立即回收匿名对象。

  • person(p3);//注意不要利用拷贝构造函数初始化匿名对象,编译器会认为 person(p3)==person p3;系统认为是声明 ~~~

  • 隐式转换法

  • person p4=10;//相当于写了person p4=person(10);也就是显示法
    person p5=p4;//拷贝构造。


 拷贝构造的调用顺序

- 来初始化一个新的对象时。

- 值传递的会复制一份内存。故在调用默认构造时也调用了拷贝构造。

- 值传递返回局部变量时也会调用一次默认函数和拷贝构造。

 构造函数的调用

- 用户定义有参构造函数,c++不提供默认无参构造。但调用拷贝构造


- 如果用户定义拷贝构造函数,c++不会提供其他的构造函数


- 如果没有调用函数,系统会自动提供。例如:拷贝构造,系统会进行赋值操作。

### C++构造函数调用方式和规则 #### 默认构造函数未显式定义任何构造函数时,编译器会提供一个默认无参构造函数。此构造函数不接受参数并执行基本初始化[^1]。 ```cpp class MyClass { public: MyClass() { /* 编译器自动生成 */ } }; ``` 对于默认拷贝构造函数,在对象通过值传递或赋值操作创建副本时被调用。如果程序员没有声明自己的版本,则编译器也会自动合成这个成员函数。 ```cpp MyClass obj1; MyClass obj2 = obj1; // 调用了默认拷贝构造函数 ``` #### 构造函数调用规则 在某些情况下,即使已经定义了一个特定型的构造方法(比如只定义了带参数的构造函数),编译器也不会再为你生成其他形式的构造函数。这意味着如果你希望支持多种实例化方式,则需要手动实现这些额外的方法[^2]。 ##### 代码示例 - 只定义有参构造函数 考虑下面的例子,其中 `Person` 仅有一个接收姓名作为参数的构造函数: ```cpp #include <string> using namespace std; class Person { private: string name; public: explicit Person(const string& n) : name(n) {} }; int main() { // 下面这行代码会导致错误:无法找到匹配的构造函数来实例化 'Person' // Person p; // 正确的方式是使用已有的构造函数 Person person("Alice"); } ``` 在这个例子中,因为 `Person` 已经有了一个带有字符串参数的构造函数,所以不能再隐式地使用默认构造函数来进行对象的创建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值