鱼C论坛

 找回密码
 立即注册
查看: 2510|回复: 0

[学习笔记] 027-C++之构造函数

[复制链接]
发表于 2018-8-28 22:22:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-9-21 20:31 编辑

1、构造函数
        构造函数是C++中用于初始化对象状态的特殊函数;
        构造函数在对象创建时自动被调用(默认调用),隐式调用;
        构造函数和普通函数一样都遵循重载函数;
必要的时候,必须手工编写拷构造函数。
构造函数有三种:
        ①无参(默认)构造函数
        ②有参构造函数
        ③拷贝构造函数

2、无参构造和有参构造函数
无参构造函数是类的默认构造函数,当仅是声明一个类对象时,会默认调用无参构造函数。
有参构造函数的调用方法有三种:
  1. class Test88
  2. {
  3. public:
  4.         //有参构造函数
  5.         Test88(int a)
  6.         {
  7.                 m_a = a;
  8.         }
  9.         // 无参构造函数
  10.         Test88()
  11.         {
  12.                 m_a = 0;
  13.         }
  14.         // 拷贝构造函数
  15.         Test88(/*const*/ Test88 &obj)  // const 用于保护实参只读
  16.         {
  17.                 cout << "我也是构造函数" << endl;
  18.                 m_a = obj.getA();
  19.         }
  20. private:
  21.         int m_a;
  22. };
  23. int main()
  24. {
  25.         // 有参构造函数调用方法1:括号法
  26.         Test88 t1(10);
  27.         // 有参构造函数调用方法2:=法
  28.         Test88 t2 = 20;
  29.         // 有参构造函数调用方法3:手工调用
  30.         Test88 t3 = Test88(30);
  31.         system("pause");
  32.         return 0;
  33. }
复制代码

上面直接在主函数中直接去创建对象,这样就需要显式的去调用对象的析构函数,来使得对象的生命周期得到完整的呈现。
于是可以给对象搭建一个舞台,让对象的生命周期的到完整的体现:
  1. void playStage()
  2. {

  3.         Test88 t1(10);
  4.         Test88 t2 = 20;
  5.         Test88 t3 = Test88(30);
  6. }
  7. int main()
  8. {
  9.         playStage();
  10.         system("pause");
  11.         return 0;
  12. }
复制代码

3、拷贝构造函数的四种应用场景
定义:类名(const 类名 &obj)            // const 用于保护实参只读
应用场景1
利用 = 给一个已经生成好的对象给刚声明的新对象初始化。
  1. Test88 t4;
  2. Test88 t5 = t4;
复制代码

应用场景2
利用 () 给一个已经生成好的对象给刚声明的新对象初始化。
  1. Test88 t4;
  2. Test88 t5(t4);
复制代码

应用场景3
对象在从实参传给形参的时候,也就是调用一个函数,这个函数的参数中有类形参时,在生成形参时会调用拷贝构造函数。
  1. class Location
  2. {
  3. public:
  4.         Location(int xx = 0, int yy = 0)
  5.         {
  6.                 X = xx;  Y = yy;  cout << "Constructor Object.\n";
  7.         }
  8.         Location(const Location & p)             //复制构造函数
  9.         {
  10.                 X = p.X;  Y = p.Y;   cout << "Copy_constructor called." << endl;
  11.         }

  12.         ~Location() { cout << X << "," << Y << " Object destroyed." << endl; }
  13.         int  GetX() { return X; }
  14.         int GetY() { return Y; }
  15. private:   int  X, Y;
  16. };

  17. void f(Location  p)
  18. {
  19.         cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl;
  20. }

  21. void playobjmain()   //让对象唱戏的舞台
  22. {
  23.         Location A(1, 2);
  24.         f(A);     // 构造函数应用场景3  
  25.         // 这里实参A传给形参p  在建立局部变量p时会调用构造函数,返回函数时会调用局部变量p的析构函数
  26. }

  27. int main()
  28. {
  29.         playobjmain();
  30.         system("pause");
  31.         return 0;
  32. }
复制代码

应用场景4
调用返回类对象的函数的时,在返回类对象时会创建一个匿名对象,此时会调用匿名构造函数。
  1. void f(Location  p)
  2. {
  3.         cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl;
  4. }

  5. Location g()
  6. {
  7.         Location A(1, 2);
  8.         // 在返回类对象A时,先执行用A去创建一个匿名类,(此时会调用拷贝构造函数),匿名类存放于堆区
  9.         return A;      // 函数返回后就先析构局部对象A
  10. }
  11. void main101()
  12. {
  13.         Location B;
  14.         B = g();  // 用匿名对象给B赋值,然后马上析构匿名对象

  15. }

  16. void main102()
  17. {
  18.         Location B =  g();  // 直接把匿名对象交给B,不再创建对象B

  19. }

  20. int main()
  21. {
  22.         main101();
  23.         main102();
  24.         system("pause");
  25.         return 0;
  26. }
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 02:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表