类与对象(下)

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🐻‍❄个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🕊系列专栏:零基础学习C语言----- 数据结构的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉


🎉文章简介:

🎉本篇文章对 **c++类和对象(下)**学习的相关知识进行分享!🎉

类和对象 分为三篇, (上,中,下),🎉 这是 类和对象(下)篇

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉


目录

一.构造函数的补充

函数体内初始化

初始化列表

不能只要初始化列表(函数体内初始化的意义)?

初始化列表解决的问题:

关键字explicit

内置类型转化自定义类型

二.static成员

2.1概念

2.2特性

三.友元

3.1友元函数

3.2友元类

四.内部类

匿名对象


一.构造函数的补充

函数体内初始化

虽然构造函数调用后,对象已经有了一个初始值,但是不能将其称为对对象成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化,因为初始化只能初始化一次,而构造函数可以多次赋值;只能在初始化列表中初始化;

初始化列表

初始化列表:以一个冒号开始,接着是以一个逗号分隔的数据成员列表,每个"成员变量"后面跟一个带有初始值或则表达式的括号;

函数体内初始化的弊端:

在函数体内不能初始化++引用变量和const修饰的变量++;

因为:++引用变量和const修饰++的变量都只能在定义的时候初始化;

举个栗子:

而在初始化列表就可以

函数体内初始化与初始化列表也可以混着使用:

注意:

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

2.类中包含++引用成员变量,const成员变量++ 和++没有默认构造函数的自定义类型成员++ 时,这些只能放在初始化列表中;

3.成员变量在类中++声明次序++ 就是其在++初始化列表中的初始顺序++,与其在初始化列表中的先后顺序无关;(选择题容易出现)

4.如果类里面成员也有类的时候,则在初始化的时候,是调用它自己的默认构造函数,如果没有默认构造函数,则会编译报错;

声明时给的缺省值的作用:

如果声明时给了缺省值,在初始化的时候(函数体内与初始化列表),没有显示的给值初始化,就会用给的缺省值;

举个栗子:

不能只要初始化列表(函数体内初始化的意义)?

如果只要初始化列表,则检查的工作有些无法完成,如当在初始化一个需要动态开辟空间的成员时,则开辟失败无法perror提示和终止程序;

举个栗子:

初始化列表解决的问题:

1.引用 ,const ,没有默认构造函数的自定义类型成员 的初始化问题

2.有些自定义类型成员想要自己来控制初始化值,不想用默认的构造函数来初始化;

3.尽量使用初始化列表,初始化列表是定义的地方,不写也会走初始化列表,先走初始化列表,再走函数体;

拷贝构造和赋值拷贝的区别:

关键字explicit

explicit作用: 在自定义类型的构造函数前面加,则内置类型不能隐式类型转换为该自定义类型;

但是如果显示的强制类型转换 ,explicit不起作用;

内置类型转化自定义类型

内置类型转换成自定义类型,是自定义类型的单参数(支持传一个参数或者多参数带缺省)的构造函数 支持的;

举个栗子:

注意:自定类型的构造函数必须是是单参数****(支持传一个参数或者多参数带缺省) 的构造函数;

如果不想让内置类型转换为该自定义类型,就在该自定义类型的构造函数前面加explicit;

c++11支持多参数的转换

举个栗子:

二.static成员

2.1概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外面进进行初始化;

面试题:

实现一个类,计算程序中创建出了多少个类对象?

2.2特性

1.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区;

2.静态成员变量必须在类外面定义,定义时不添加static关键字,类中只是声明;

3.类静态成员可用 类名::静态成员 或者 对象.静态成员来访问;

4.静态成员函数没有隐藏的this指针,不能访问任何非静态成员;

5.静态成员也是类的成员,受public,protected,private访问限定符的限制;

问题:

1.非静态成员函数可以调用非静态成员函数吗?

不可以,静态成员函数没有this指针

2.非静态成员函数可以调用类的静态成员函数吗?

可以

三.友元

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

3.1友元函数

举个栗子:

注意:

1.当一个函数想要访问一个类的成员时,可以将这个函数设置为该类的友元函数

  1. 友元函数可以直接访问类的私有成员,它是定义在类外面的普通函数,不属于任何类,但是需要在类里面声明,声明时需要加friend关键字;

3.友元函数可访问类里面的私有和保护成员,但不是类的成员函数,没有this指针;

4.友元函数不能用const修饰

5.友元函数可以在类定义的任何地方声明,不受类访问限定符的限制;

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

友元函数的调用与普通函数的调用相同;

3.2友元类

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

友元关系是++单向的(比如A是B的友元,A可以访问B的成员,但是B不能访问A的成员),不具有交换性;++

友元关系不能传递;

友元关系不能继承;

举个栗子:

四.内部类

简单地说:就是一个类里面又定义了一个类,里面的这个类就是内部类;

内部类是++一个独立的类,它不属于尾部外部类,更不能通过外部类的对象去访问内部类的成员,外部类对内部类没有任何权限;++

注意:

内部类的就是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元;

特性:

1.内部类可以定义在外部类中的public,private,protected都是可以的;

2++.注意内部类可以直接访问外部类中的static成员,不需要外部的对象/类名;++

3.sizeof(外部类)=外部类的大小,和内部类没有关系,不计算内部类的大小;

4.内部类受外部类访问限定符的限制和外部类的类域的限制;

匿名对象

顾名思义:没有名字的对象



相关推荐
AlexMercer101239 分钟前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
小灰灰爱代码1 小时前
C++——求3个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数模板来实现。
开发语言·c++·算法
BeyondESH3 小时前
Linux线程同步—竞态条件和互斥锁(C语言)
linux·服务器·c++
豆浩宇3 小时前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr
WG_173 小时前
C++多态
开发语言·c++·面试
Charles Ray4 小时前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
重生之我在20年代敲代码4 小时前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
迷迭所归处10 小时前
C++ —— 关于vector
开发语言·c++·算法
CV工程师小林11 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
white__ice11 小时前
2024.9.19
c++