一:若没有显示写构造函数,默认会有一个默认构造函数(无参),若自己构造后,不会存在这个默认构造函数

二:类成员若是有const修饰,必须在对象初始化的时候,为该类成员赋值(或者一开始就定死,同C中)

  1. class A
  2. {
  3. private:
  4. const int a = 11; //直接定死
  5. const int b;
  6. const int c;
  7. public:
  8. A(int a1,int a2) :c(a2),b(a1) //构造之前的声明:注意成员变量的初始化顺序和声明的顺序相关-->先是c后是b
  9. {
  10. //this->b = a1; //这样是不允许的,这是再赋值修改,只能在声明中修改
  11. }
  12.  
  13. void getInfo()
  14. {
  15. cout << "a:" << a << endl;
  16. cout << "b:" << b << endl;
  17. cout << "c:" << c << endl;
  18. }
  19. };
  20.  
  21. void main()
  22. {
  23. A a(,);
  24. a.getInfo();
  25. system("pause");
  26. }

三:类成员是对象声明时,必须在构造函数中进行初始化(同二)

  1. class B
  2. {
  3. private:
  4. int a, b, c;
  5. public:
  6. B()
  7. {
  8. cout << "调用默认构造" << endl;
  9. }
  10.  
  11. B(int a, int b, int c)
  12. {
  13. this->a = a;
  14. this->b = b;
  15. this->c = c;
  16. }
  17.  
  18. void getInfo()
  19. {
  20. cout << "a:" << a << endl;
  21. cout << "b:" << b << endl;
  22. cout << "c:" << c << endl;
  23. }
  24. };
  25.  
  26. class A
  27. {
  28. private:
  29. const int c;
  30. B b; //在类中是变量声明,不会进行构造为对象
  31. public:
  32. A(int a1,int a2,int a3):b(a1,a2,a3),c(a1)
  33. {
  34. //this->b = a1; //这样是不允许的,这是再赋值修改,只能在声明中修改
  35. }
  36.  
  37. void getInfo()
  38. {
  39. cout << "c:" << c << endl;
  40. b.getInfo();
  41. }
  42. };
  43.  
  44. void main()
  45. {
  46. A a(,,);
  47. a.getInfo();
  48. system("pause");
  49. }

四:构造和析构调用顺序

  1. .当类中有成员变量是其他类的对象时,必须先调用成员变量的构造函数,调用顺序与声明顺序一致,之后才会调用自己的构造函数
  2. .析构函数调用顺序与对应的构造函数调用顺序相反

五:补充---友元函数(破坏封装性)

(一)友元函数不受访问限制符影响

(二)友元函数是在类外部的一个函数。可以通过对象参数访问私有数据成员

(三)友元函数使用

  1. class A
  2. {
  3. private:
  4. const int c;
  5. int af=;
  6.  
  7. //设置友元函数声明 不受访问限制符影响
  8. friend void FriendSet(A *ptr, int n); //第一个参数代表当前对象,其他自己设置
  9. //类似于在外部设置一个函数接口,可以让所有用户进行修改访问
  10. //但是不受访问修饰符限制,类的封装性丢失
  11. public:
  12. A(int a1,int a2,int a3):c(a1)
  13. {
  14. }
  15.  
  16. void getInfo()
  17. {
  18. cout << "c:" << c << endl;
  19. cout << "af:" << af << endl;
  20. }
  21. };
  22.  
  23. void FriendSet(A *ptr, int n) //第一个参数代表当前对象  在类的外部实现
  24. {
  25. ptr->af = n;
  26. }
  27. void main()
  28. {
  29. A a(,,);
  30. FriendSet(&a, );
  31. a.getInfo();
  32. system("pause");
  33. }

六:补充---友元类(破坏封装性)

  1. B类是A类的友元类,则B类的所欲成员函数都是A类的友元函数
  1. class A
  2. {
  3. private:
  4. const int c;
  5. int af=;
  6. friend class B;  //也是不受访问限制符影响
  7. public:
  8. A(int a1,int a2,int a3):c(a1)
  9. {
  10. }
  11.  
  12. void getInfo()
  13. {
  14. cout << "c:" << c << endl;
  15. cout << "af:" << af << endl;
  16. }
  17. };
  18.  
  19. class B
  20. {
  21. private:
  22. A Aobj;  //这是声明,必须在构造函数中进行初始化
  23. public:
  24. void Set(int i)
  25. {
  26. Aobj.af = i; //可以直接访问私有
  27. }
  28.  
  29. B() :Aobj(10, 11, 12) //必须设置构造函数
  30. {
  31.  
  32. }
  33.  
  34. void Get()
  35. {
  36. cout << "c:" << Aobj.c << endl;
  37. cout << "af:" << Aobj.af << endl;
  38. }
  39. };
  40.  
  41. void main()
  42. {
  43. B Bobj; //会调用构造函数
  44. Bobj.Set();
  45. Bobj.Get();
  46. system("pause");
  47. }

C++回顾day02---<对象构造和析构,外加友元函数>的更多相关文章

  1. c++入门之—运算符重载和友元函数

    运算符重载的意义是:将常见的运算符重载出其他的含义:比如将*重载出指针的含义,将<<与cout联合使用重载出输出的含义,但需要认识到的问题是:运算符的重载:本质仍然是成员函数,即你可以认为 ...

  2. Swift教程之运算符重载

    http://blog.csdn.net/mengxiangyue/article/details/43437797 原文地址:http://www.raywenderlich.com/80818/o ...

  3. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  4. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  5. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  6. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

  7. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  8. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  9. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  10. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

随机推荐

  1. POJ 1017 最少包裹

    参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6414760.html Packets Time Limit: 1000MS   Memory Li ...

  2. 【XSY2524】唯一神 状压DP 矩阵快速幂 FFT

    题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修 ...

  3. Codeforces | CF1010C 【Border】

    这道题大致题意是给定\(n\)个十进制整数和一个进制数\(k\),可以用无数多个给定的十进制整数,问这些十进制整数的和在模k意义下有多少种不同的结果(\(k\)进制下整数的最后一位就是这个数模\(k\ ...

  4. 逆向并查集 HYSBZ1015星球大战starwar

    星球大战starwar HYSBZ - 1015   很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系 ...

  5. HR_Jumping on the Clouds

    1.没有考虑i+2越界的问题 2.没有考虑结尾三个零导致 -5 3.没有考虑len(c)<2 导致 -5 #!/bin/python3 import math import os import ...

  6. HDU 2604 Queuing(矩阵快速幂)

    题目链接:Queuing 题意:有一支$2^L$长度的队伍,队伍中有female和male,求$2^L$长度的队伍中除 fmf 和 fff 的队列有多少. 题解:先推导递推式:$f[i]=f[i-1] ...

  7. HDU 5950 Recursive sequence(矩阵快速幂)

    题目链接:Recursive sequence 题意:给出前两项和递推式,求第n项的值. 题解:递推式为:$F[i]=F[i-1]+2*f[i-2]+i^4$ 主要问题是$i^4$处理,容易想到用矩阵 ...

  8. [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)

    这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...

  9. Diagnostic Trouble Code诊断故障码

    所有电子控制单元(ECU)都会根据整车厂规范要求对相关故障进行记录,并储存在NVM(也称作EEPROM)相当于平常电脑上硬盘里.除故障代码外,还会记录故障发生时相关整车情况(如供电电压,环境温度 ...

  10. 解决zabbix3.4图表显示中文乱码问题

    问题描述: 在Zabbix界面设置中,已经调成中文语言,可能zabbix自身携带的字体还不够完美,出现如下乱码: 测试环境: zabbix 3.4(经测试,目前3.x版本都适用) 解决步骤: 1. 寻 ...