【C++】类和对象(下)

简介: 构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

一. 构造函数中成员变量的赋值与成员变量的初始化


1. 构造函数体内成员变量的赋值


构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

20210416211422348.png


2. 构造函数体外成员变量的初始化


2.1 初始化列表概念


成员变量的初始化是在构造函数的初始化列表中的。


写在构造函数的参数列表后,函数体外

以冒号开始,以逗号分隔,最后不需要任何符号

需要初始化的值放在成员变量的后面

20210416212701201.png


2.2 初始化列表的几点说明


注意区分成员变量的声明和定义

20210416215027491.png


每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)


引用成员变量,const成员变量,没有默认构造函数的自定义类型成员变量必须放在初始化列表位置进行初始化。

20210416220030399.png


成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

20210416220740198.png


3. explicit关键字


构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。

20210416222622264.png


二. static成员


1. 概念

20210416224003331.png


2. 特性


静态成员为所有类对象所共享,不属于某个具体的实例


静态成员变量必须在类和main函数外的全局范围定义,定义时不添加static关键字


20210416224831700.png

静态成员函数类里或者类外都可以定义,类外定义时不加static


类静态成20210417103409438.png员即可用类名::静态成员或者对象.静态成员来访问



静态成员函数没有隐藏的this指针,不能访问任何非静态成员;因为静态成员变量是类所共有的,所以静态成员变量函数可以突破类域和访问限定符来访问静态成员。


静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值。


3. 问题


静态成员函数可以调用非静态成员函数吗?(不行)


20210417104422204.png


非静态成员函数可以调用类的静态成员函数吗?(可以)

20210417104849324.png



三. C++11 的成员初始化新玩法


C++11支持非静态成员变量在声明同时给声明的成员变量缺省值(实际的缺省值还是以构造函数的为准)

20210417110318227.png


四. 友元


1. 概念


友元分为:友元函数和友元类


友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。


20210417120517995.png


2. 友元函数


2.1 概念


友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类。


问题:既然是为了访问类的私有成员,那我们干脆把函数定义为类的成员函数不就行了吗,友元函数有什么用呢?


其实在一些情况下,必须要定义出友元函数才能解决问题(比如我们要重载输入输出的<<和>>操作符时)

20210417115046846.png



2.2 特性


友元函数可访问类的私有和保护成员,但不是类的成员函数

友元函数不能用const修饰(因为他不是类的成员函数)

一个函数可以是多个类的友元函数

友元函数的调用与普通函数的调用和原理相同


3. 友元类


友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的所有成员。


友元关系是单向的,不具有交换性。(B是A的友元函数,所以B类中可以直接访问A类的所有成员;但是A类只能访问B类的公有成员,不能访问B类的私有的成员)

友元关系不能传递(如果B是A的友元,C是B的友元,则不能说明C时A的友元。)


五. 内部类


1. 概念


如果一个类定义在另一个类的内部,这个定义在内部的类就叫做内部类。


2. 特性


内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类

内部类就是外部类的友元类(a. 内部类可以直接访问外部类的成员 b. 外部类不是内部类的友元20210417121452183.png,外部类对内部类没有任何优越的访问权限)



内部类可以定义在外部类任何位置

sizeof(外部类)=外部类,和内部类没有任何关系


相关文章
|
1月前
|
编译器 C++
C++之类与对象(完结撒花篇)(上)
C++之类与对象(完结撒花篇)(上)
35 0
|
8天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
36 4
|
9天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
33 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
16 0
|
1月前
|
编译器 C++ 数据库管理
C++之类与对象(完结撒花篇)(下)
C++之类与对象(完结撒花篇)(下)
31 0
|
1月前
|
编译器 C++
C++之类与对象(3)(下)
C++之类与对象(3)(下)
32 0
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)