cpp构造函数调用规则

02-4 构造函数调用规则

写了一个类,c++的编译器会给这个类自动添加四个函数,但是我们目前只用知道前三个。

  1. 默认构造函数(无参,函数体为空)
  2. 默认析构函数(无参,函数体为空)
  3. 默认拷贝构造函数(对属性进行值拷贝)。

构造函数调用规则如下:

  • 如果用户定义了有参构造函数,c++不会再自动提供默认构造函数(也就是没有参数,函数体为空的),但是会提供默认拷贝构造函数。
  • 如果用户定义了拷贝构造函数,c++不会提供任何其他的构造函数。
  1. 如果用户定义了有参构造函数,c++不会再自动提供默认构造函数,但是会提供默认拷贝构造函数。

    #include 
    using namespace std;
    class Person
    {
    public:
    int m_age;
    Person()
    {
        cout << "这是 Person 的默认构造函数调用。" << endl;
    }
    Person(int age)
    {
        m_age = age;
        cout << "这是 Person 的有参构造函数调用。" << endl;
    }
    //Person(const class Person& p)
    //{
    //  m_age = p.m_age;
    //  cout << "这是 Person 的拷贝构造函数调用。" << endl;
    //}
    ~Person()
    {
        cout << "这是 Person 的析构函数调用。" << endl;
    }
    };
    void main()
    {
    class Person p1;
    p1.m_age = 18;
    class Person p2(p1);
    cout << p2.m_age << endl;
    }

    运行结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)

    这是 Person 的默认构造函数调用。
    18
    这是 Person 的析构函数调用。
    这是 Person 的析构函数调用。

    我们没有提供拷贝构造函数(注释掉了),但是编译器会自动提供一个拷贝构造函数(所以p2.m_age会被正确赋值)

  2. 如果用户定义了有参构造函数,c++不会再自动提供默认构造函数。

    #include 
    using namespace std;
    class Person
    {
    public:
    int m_age;
    //Person()
    //{
    //  cout << "这是 Person 的默认构造函数调用。" << endl;
    //}
    Person(int age)
    {
        m_age = age;
        cout << "这是 Person 的有参构造函数调用。" << endl;
    }
    //Person(const class Person& p)
    //{
    //  m_age = p.m_age;
    //  cout << "这是 Person 的拷贝构造函数调用。" << endl;
    //}
    ~Person()
    {
        cout << "这是 Person 的析构函数调用。" << endl;
    }
    };
    void main()
    {
    class Person p1;
    }

    这里会报错:

    类 "Person" 不存在默认构造函数
  3. 如果用户定义了拷贝构造函数,c++不会提供任何其他的构造函数。

    #include 
    using namespace std;
    class Person
    {
    public:
    int m_age;
    //Person()
    //{
    //  cout << "这是 Person 的默认构造函数调用。" << endl;
    //}
    //Person(int age)
    //{
    //  m_age = age;
    //  cout << "这是 Person 的有参构造函数调用。" << endl;
    //}
    Person(const class Person& p)
    {
        m_age = p.m_age;
        cout << "这是 Person 的拷贝构造函数调用。" << endl;
    }
    ~Person()
    {
        cout << "这是 Person 的析构函数调用。" << endl;
    }
    };
    void main()
    {
    class Person p1;
    p1.m_age = 18;
    class Person p2(10);
    }

    这里会报错:

    类 "Person" 不存在默认构造函数 
    没有与参数列表匹配的构造函数 "Person::Person" 实例
文章「cpp构造函数调用规则」,由本站用户「Admin」发布。文章仅代表Admin观点,不代表本站立场。
页面网页地址「https://xiaozhiyuqwq.top/p/868」。
如您对文章及其附件提出版权主张,或进行引用转载等,请查看我们的【版权声明】
无评论:-)

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇