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

本文详细介绍了C++中构造函数和成员变量初始化的相关知识,包括构造函数体内赋值与初始化列表的区别,explicit关键字的作用,static成员的特性及问题,C++11的成员初始化新特性,以及友元和内部类的概念与特性。强调了初始化列表的重要性,特别是对于引用、const成员和自定义类型成员的初始化,并讨论了友元函数和友元类在访问权限和使用场景上的特点。
摘要由CSDN通过智能技术生成

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

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

构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
在这里插入图片描述

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

2.1 初始化列表概念

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

  • 写在构造函数的参数列表后,函数体外
  • 以冒号开始,以逗号分隔,最后不需要任何符号
  • 需要初始化的值放在成员变量的后面
    在这里插入图片描述

2.2 初始化列表的几点说明

  • 注意区分成员变量的声明和定义
    在这里插入图片描述

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

  • 引用成员变量const成员变量没有默认构造函数的自定义类型成员变量必须放在初始化列表位置进行初始化。
    在这里插入图片描述

  • 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。
    在这里插入图片描述

3. explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用
在这里插入图片描述


二. static成员

1. 概念

在这里插入图片描述

2. 特性

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

  • 静态成员变量必须在类和main函数外的全局范围定义,定义时不添加static关键字
    在这里插入图片描述

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

  • 类静态成员即可用类名::静态成员或者对象.静态成员来访问
    在这里插入图片描述

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

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

3. 问题

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

在这里插入图片描述

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

在这里插入图片描述


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

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

四. 友元

1. 概念

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

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度破坏了封装,所以友元不宜多用。
在这里插入图片描述

2. 友元函数

2.1 概念

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

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

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

在这里插入图片描述

2.2 特性

  • 友元函数可访问类的私有和保护成员,但不是类的成员函数
  • 友元函数不能用const修饰(因为他不是类的成员函数)
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数的调用和原理相同

3. 友元类

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

  • 友元关系是单向的,不具有交换性。(B是A的友元函数,所以B类中可以直接访问A类的所有成员;但是A类只能访问B类的公有成员,不能访问B类的私有的成员)
  • 友元关系不能传递(如果B是A的友元,C是B的友元,则不能说明C时A的友元。)

五. 内部类

1. 概念

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

2. 特性

  • 内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类
  • 内部类就是外部类的友元类(a. 内部类可以直接访问外部类的成员 b. 外部类不是内部类的友元,外部类对内部类没有任何优越的访问权限)

在这里插入图片描述

  • 内部类可以定义在外部类任何位置
  • sizeof(外部类)=外部类,和内部类没有任何关系
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值