C++ 指针 参数 静态 常 友元与组合概念

一 类类型作为函数参数

1 类类型作参数类型的三种方式

1) 对象本身作为参数

由于C++采用传值的方式传递参数,因此使用对象本身参数时,形参是实参的一个拷贝。在这种情况下,最好显式地为类定义一个拷贝构造函数,以免出现不容易发现的错误。

距离:对象本身做函数参数
在这里插入图片描述
对象引用作为参数
这是一种推荐方式。它比对象本身参数或对象指针参数都要容易理解和使用,同时没有任何的副作用。
在这里插入图片描述
对象指针作为参数
对象指针指向实参对象,通过间接方式访问和修改它所指向的对象,实际上就是访问和修改实参对象。

二 对象数组

1 对象数组

与任何其他数据类型一样,可以创建一个类的对象数组。
例如:Clock clocks[10];

通过下标访问数组中的对象,进而访问该对象的公有成员。
例如:clocks[3].ShowTime();

2 数组初始化

1) 显式初始化数组元素

const unsigned arr_size=3;
int ia[array_size]={0,1,2}

2) 隐式初始化

若无显式初始化,则:
在函数体外定义的内置数组,元素均为0
函数体内定义的内置数组,元素无初始化
若元素为类类型,无论在哪里定义,则自动调用该类的默认构造函数进行初始化。如果该类没有默认构造函数,则必须为该数组的元素提供显式初始化。

3 对象数组的初始化

对象数组的初始化过程,实际上就是调用构造函数对每一个数组元素进行初始化的过程。

如果在声明数组时给出每一个数组元素的初始值,在初始化过程中就会调用最匹配的构造函数。

在这里插入图片描述
初始化array[0]时调用的是Point(float,float)构造函数
初始化array[1]时调用的是Point(float)构造函数
初始化array[2]时调用的是Point()构造函数

4 对象指针的加减操作

在这里插入图片描述
在这里插入图片描述

三 静态成员

1 静态成员

当用关键字static说明一个类成员时,该成员称为静态成员。
静态成员分为:
静态数据成员;
镜头成员函数;

2 静态数据成员的定义和初始化

1) 定义静态数据成员

在这里插入图片描述

2) 初始化静态数据成员

int ABCD::s_value=6;//在类外定义静态数据成员,在定义时给初值

例子:静态数据成员的特性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3)静态数据成员的使用

静态数据成员也有public和private之分,因此在类外只能访问public属性的静态数据成员,在类内可以访问所有属性的静态数据成员。

由于静态数据成员是属于类的,因此在类外按如下形式访问public静态数据成员:
ABCD:😒_value;
特别地,当类对象不存在时,也可以访问类的静态数据成员。

例:静态数据成员的基本用法

在这里插入图片描述

4) 静态成员函数

静态成员函数的定义
在这里插入图片描述
静态成员函数只属于一个类,它没有this指针。
静态成员函数也可以声明为public或private属性。

四 常对象与常成员(const)

1 常对象与常成员(const)

如果某个对象不允许被修改,则该对象称为常对象。C++用关键字const来定义对象。

const也可以用来限定类的数据成员和成员函数,分别称为类的常数据成员和常成员函数。

常对象和常成员明确规定程序中各种对象的变与不变的界限,从而进一步增加了C++程序的安全性和可控性。

1)常对象

在这里插入图片描述
在这里插入图片描述
常对象不能变,只能调用常成员函数。
啥时用常对象?
(1)函数返回值;(2)函数形参(常引用);

2) 常数据成员

变量的值不能变。
类型 const 数据成员名;或者 const类型数据成员名;
在这里插入图片描述

3) 常成员函数

该函数不能修改对象数据成员的值。
返回类型 成员函数名(参数表)const;
(1) 常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修改的成员函数。
(2) 常对象只能调用它的常成员函数,而不能调用其他成员函数。
(3)const关键字可以用于参与重载函数的区分;
在这里插入图片描述
在这里插入图片描述

五 友元

1 友元关系

封装的目的就是为了实现信息隐蔽
一个对象的私有成员只能被自己的成员访问到。当类外的对象或函数要访问这个类的私有成员时,只能通过该类提供的公有成员间接地进行。

C++提供了友元机制来打破私有化的界限,即一个类的友元可以访问到该类的私有成员。

2 友元函数

问题的提出
Point类代表"点”,考虑如下需求:
需要一个函数来计算任意两点间的距离,那么这个函数该如何设计呢?
在这里插入图片描述

3 友元类

除了将一个普通函数声明为一个类的友元函数外,也可以将一个类Y声明为另一个类X的友元类。
友元类的特点:类Y中的所有成员函数都成员函数都成为类X的友元函数,都能直接访问类X中所有的成员。
在这里插入图片描述
举例

在这里插入图片描述
将成员函数说明为另一个类的友元函数
在这里插入图片描述

对友元关系的总结

友元具有如下的性质:
类的友元可以直接访问它的所有成员。
友元的声明必须放在类的内部,但放在哪个段没有区别。
友元关系不具备传递性,即X是Y的友元,但Y不一定是X的友元。
友元关系不具备传递性,即X是Y的友元,Y是Z的友元,但X不一定是Z的友元。

六 类的组合

1 类的组合

一个类的对象作为另一个类的成员,这体现的是整体和部分的关系,即对象的包含关系,这个作为成员的对象被称为子对象。

举例:
Circle类的实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己整理的C++要背的一些概念,华南师范大学考c++的建议看看,21届考研有考到哦!!(可打印版) 1. 面向对象的三个基本特征 4 2. 抽象 4 3. 如何实现多态性 4 4. const与define的区别 4 5. static作用 4 6. 静态数据成员与静态成员函数 5 7. 静态数据成员与全局变量的不同 5 8. 为什么引入友元概念? 5 9. 什么是友元函数? 5 10. 友元成员函数 5 11. 友元类 5 12. 函数重载 5 13. 运算符重载 6 14. 运算符重载函数的使用 6 15. 重载运算符的规则 6 16. 为什么要使用继承 6 17. 保护成员的作用 6 18. 多重继承 6 19. 虚基类及其作用 6 20. 派生类的构造函数和析构函数的构造规则 7 21. 虚函数及其作用 7 22. 静态关联和动态关联 7 23. 函数重载与虚函数的不同 7 24. 虚析构函数 8 25. 纯虚函数 8 26. 抽象类 8 27. 抽象类与接口的区别 8 28. 32.输入输出流 8 29. 标准的输出流对象有哪些 8 30. 标准的输入流对象有哪些 9 31. 文件流类与文件流对象 9 32. 两个短整型数相加后,结果是什么类型? 9 33. 什么是值传递? 9 34. 值传递、引用传递和指针传递的区别是什么? 9 35. 什么是函数模板?什么是模板函数?函数模板有什么用途? 9 36. C++是如何实现函数重载的? 10 37. 全局变量和局部变量的主要区别是什么? 使用全局变量有什么好处?有什么坏处? 10 38. 变量定义和变量声明有什么区别? 10 39. 引入结构体有什么好处? 10 40. 单链表中为什么要引入头结点? 10 41. 结构体类型定义的作用是什么? 结构体类型的变量定义的作用是什么? 10 42. 用自己的话描述逐步细化的过程 10 43. 为什么库的实现文件要包含自己的头文件? 11 44. 什么头文件要包含 #ifndef...#endif这对编译预处理指令? 11 45. 为什么要使用库? 11 46. 用struct定义类型与用class定义类型有什么区别? 11 47. 构造函数和析构函数的作用是什么?它们各有什么特征? 11 48. 友元的作用是什么? 11 49. 静态数据成员有什么特征?有什么用途? 11 50. 在定义一个类时,哪些部分应放在头文件(.h文件)中,哪些部分应放在实现文件(.cpp文件)中? 12 51. 什么情况下类必须定义自己的复制构造函数? 12 52. 量数据成员和静态量数据成员有什么区别?如何初始化量数据成员?如何初始化静态量数据成员? 12 53. 什么是this指针?为什么要有this指针? 12 54. 复制构造函数的参数为什么一定要用引用传递,而不能用值传递? 12 55. 构造函数为什么要有初始化列表? 12 56. 如何区分++和--的前缀用法和后缀用法的重载函数? 12 57. 类有几个默认的成员函数? 13 58. 什么是抽象类?定义抽象类有什么意义? 抽象类在使用上有什么限制? 13 59. 为什么要定义虚析构函数? 13 60. 试说明派生类对象的构造和析构次序。 13 61. 试说明虚函数和纯虚函数有什么区别 13 62. 基类指针可以指向派生类的对象, 为什么派生类的指针不能指向基类对象? 13 63. 如果一个派生类新增加的数据成员中有一个对象成员,试描述派生类的构造过程 13 64. 为什么函数模板的使用与普通的函数完全一样, 而类模板在使用时还必须被实例化? 13 65. 类模板继承时的语法与普通的类继承有什么不同? 13 66. 什么是打开文件?什么是关闭文件?为什么需要打开和关闭文件? 14 67. 为什么要检查文件打开是否成功?如何检查? 14 68. ASCII文件和二进制文件有什么不同? 14 69. C++有哪4个预定义的流? 14 70. 什么时候用输入方式打开文件?什么时候应该用输出方式打开文件?什么时候该用app方式打开文件? 14 71. 哪些流操纵符只对下一次输入/输出有效?哪些流操纵符是一直有效直到被改变? 14 72. 什么叫做作用域?什么叫做局部变量? 什么叫做全局变量? 14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值