C++ 类和对象 (下)

初始化列表:

之前所说的构造函数初始化严格意义上来说不能叫变量初始化,只能是称为赋初值,C++给出了初始化列表的概念

标准写法:

class Date
{
public:Date (int year ,int month, int day):_year(year),_month(month),_day(day){}
private:int _year;int _month;int _day;
};

以冒号开始,逗号分隔

之所以要提出初始化列表的操作,是因为有一些变量不得不在声明的时候给予初值,如引用,const变量、没有默认构造函数的自定义变量,这三者如果不在声明的时候马上给予初值,编译器将会报错。

易错点
观察下列代码:

class A
{
public:A(int a):_a1(a),_a2(_a1){}
private:int _a2;int _a1;
};

假设实例化一个A对象,传值a=1,猜测一下输出_a1,_a2是什么,你可能会认为是1 1,其实不然,对于初始化列表而言,它不是从上到下一次初始化的,而是根据变量声明的顺序初始化的,显然_a2比_a1更早声明,列表会优先初始化_a2,此时_a1还处于随机值的状态,故最终的结果是输出 1 随机值.

正确的使用方式:

①:

A a(1);//单参
A a(1,2); //多参

②:

A a=1; //单参
A a={1,2}; //多参

我们讨论一下第二种方式为什么正确,编译器在此做了一个隐式类型转换,将int类型的1转换成了A类型的变量存储在一个临时变量中,接着临时变量将值传给a
说白了就是一次构造函数+一次拷贝构造函数,一些新版本的编译会在此将其优化成一次构造。

在构造函数前附加explicit关键字可以使第二种方式失效

匿名对象:
正如C中结构体有匿名结构体一样,C++中对象也有匿名对象

//匿名对象
class A{……};
A();

匿名对象的生命周期非常短,只有当前所在的一行,可以说是一次性用品。
之前所提到的隐式类型转化其实就是生成了一个匿名对象作为媒介完成的。

static成员:

static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的
成员函数,称之为静态成员函数

在一些特定场景下,我们在类中需要有静态成员变量和静态成员函数,我们知道静态变量的声明周期是全局的,仅可声明一次,故可以推出类中的静态成员变量和函数不属于类中,他们在类声明的时候就已经生成了实际空间。

因此在类中初始化static成员变量是会报错的,static成员变量需要在类外定义

class B
{
private:static int _b;
};
int B::_b=0;

易错点:

class C
{
public:static void Print(){cout<<_c<<endl;}
private:int _c=1;
};

上面的代码是错误,原因是因为静态成员函数没有默认的this指针,无法访问类中的元素,但是既然没有this指针,我们就可以不需要通过实际对象去调用类中的函数,

class C
{
public:static void Print(){cout<<"C++"<<endl;}
};
int main(){C::Print();return 0;
}//这样是没有问题的

友元函数:

有些时候为了方便起见我们会想让外部函数可以访问类中的私有属性,故C++引入了友元函数使得这一目的得以实现

class Date
{
friend void Print(const Date& para);
private:int _year=2024;int _month=1;int _day=1;
};
int main(){Date d1;Print(d1);return 0;
}//可以通过

友元函数不具有交换性(A是B的友元不代表B是A的友元)和传递性

————————————————————————————————————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++——stack的基本概念与常用接口

1.stack基本概念 概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 图形剖析: ____________________________栈底 | | 数据元素 | || |________________________| || | 数据元素 | || |________________________| || | 数据元…

如何用离散二维卷积公式描述卷积过程(说实话,我没搞懂为什么索引为什么设置成对称的模式。)

问题描述&#xff1a;如何用离散二维卷积公式描述卷积过程&#xff08;说实话&#xff0c;我没搞懂为什么索引为什么设置成对称的模式。&#xff09; 众所周知&#xff0c;描述图像卷积过程&#xff0c;可以使用图形法描述&#xff0c;也可以用公式法描述&#xff0c;但是具体用…

ubuntu vi 方向键乱码问题解决方案

方向键乱码问题解决方案 这个其实很简单 只需要在终端输入apt-get install vim 待安装完成就可以了

第十课:计算机心理学、教育科技及奇点,天网,计算机的未来

第十课&#xff1a;计算机心理学、教育科技及奇点&#xff0c;天网&#xff0c;计算机的未来 第三十八章&#xff1a;计算机心理学0、计算机中用到的心理学原理1、易用度2、颜色强度排序和颜色排序3、分组更好记4、直观功能5、认出VS回想6、让机器有一定的情商以及Facebook的研…

新兴电商平台都有哪些?新手做哪个比较盈利?

我是电商珠珠 近年来的电商平台层出不穷&#xff0c;由于购物方式发生了改变&#xff0c;传统的电商模式已经不能满足当前人们的需求&#xff0c;所以在抖音推出电商-抖音小店后&#xff0c;让整个电商圈发生了全新的改变。 抖音小店的出现顺势将直播电商带了起来&#xff0c…

计算机研究生论文检索方法汇总

计算机研究生论文检索方法汇总 作为一名优质(冤种)计算机在读研究生&#xff0c;检索论文是一项不可或缺的技能之一。 一、paperwithcode paperswithcode是一个免费开放的资源平台&#xff0c;提供了机器学习领域的论文、代码、数据集、方法和评估表。在这里我们可以检索不同…

Python|使用Missingno库可视化缺失值(NaN)

在真实世界数据集的情况下&#xff0c;数据集中的某些值丢失是非常常见的。我们将这些缺失值表示为NaN&#xff08;非数字&#xff09;值。但是要构建一个好的机器学习模型&#xff0c;我们的数据集应该是完整的。这就是为什么我们使用一些插补技术来用一些可能的值替换NaN值。…

C语言多线程编程-线程同步

介绍 多线程编程&#xff0c;经常会遇到线程直接数据同步&#xff0c;为了保证数据访问安全&#xff0c;就必须考虑线程之间的同步问题。在C语言中&#xff0c;多线程编程的线程同步主要依赖于POSIX线程&#xff08;Pthreads&#xff09;库提供的同步原语。以下是一些关键的线…

DevOps(6)

目录 26.如何在Linux下跨不同的虚拟桌面共享程序&#xff1f; 27.无名&#xff08;空&#xff09;目录代表什么&#xff1f; 29.什么是守护进程&#xff1f; 30.如何从一个桌面环境切换到另一个桌面环境&#xff0c;例如从KDE切换到Gnome? 26.如何在Linux下跨不同的虚拟桌面…

你的网站或许不需要前端构建(二)

前一阵&#xff0c;有朋友问我&#xff0c;能否在不进行前端编译构建的情况下&#xff0c;用现代语法开发网站界面。 于是&#xff0c;就有了这篇文章中提到的方案。 写在前面 这篇文章&#xff0c;依旧不想讨论构建或不构建&#xff0c;哪一种方案对开发更友好&#xff0c;…

JavaScript实现大整数加法

实现大整数加法 即两个数字字符相加&#xff0c;采用按位加法实现 方法 const add (a, b) > {let i a.length - 1;let j b.length - 1;let carry 0;let ret "";while (i > 0 || j > 0) {let x 0;let y 0;let sum "";if (i > 0) {x …

《工具录》NetCat

工具录 1&#xff1a;NetCat2&#xff1a;选项介绍3&#xff1a;示例3.1&#xff1a;正向连接&#xff08;被动连接&#xff09;3.2&#xff1a;反向连接&#xff08;主动连接&#xff09;3.3&#xff1a;信息收集3.4&#xff1a;文件传输 4&#xff1a;其他 本文以 kali-linux…

MySQL——视图

目录 一.视图介绍 二.基本使用 三.视图规则和限制 一.视图介绍 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 二.基本使用 创…

在 list 中根据项目需求,使用不同的方法进行查找及删除

学习目标&#xff1a; 学习目标 在 list 中根据项目需求&#xff0c;使用不同的方法进行查找及删除 学习内容&#xff1a; 内容 在 list 中根据项目需求&#xff0c;使用不同的方法进行查找在 list 中根据项目需求&#xff0c;使用不同的方法进行删除 知识总结&#xff1a; …

【mysql django】解决Django提示mysql版本过低

目录 一、解决Django提示mysql版本过低&#xff1a;django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.26) 一、解决Django提示mysql版本过低&#xff1a;django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.26) 报错&…

Netty初探:掌握高性能网络通信框架,提升Java网络编程技能

Netty初探 NIO 的类库和 API 繁杂 &#xff0c; 使用麻烦&#xff1a; 需要熟练掌握Selector、 ServerSocketChannel、SocketChannel、 ByteBuffer等。 开发工作量和难度都非常大&#xff1a; 例如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处…

左旋字符串与判断字符串左旋编程题

字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法一 void left_move(char* arr, int k) {int i 0;size_t len strlen(arr);k k % len;for (i 0; i < k; i){//左旋转一个…

30 C++ 类型转换构造函数 和 类型转换函数 operator type(类对象)

类型转换构造函数 定义 //类型转换构造函数&#xff1a; //只有一个参数的构造函数&#xff0c; //且参数不是自己的const 引用的构造函数&#xff0c;也称之为 &#xff1a;类型转换构造函数。 //类型转换构造函数&#xff1a; //只有一个参数的构造函数&#xff0c; //且参数…

2.C++的编译:命令行、makefile和CMake

1. 命令行编译 命令行编译是指直接在命令行中输入以下指令&#xff1a; 预处理&#xff1a;gcc -E main.c -o main.i 编译&#xff1a;gcc -S main.i -o main.s 汇编&#xff1a;gcc -c main.s -o main.o 链接&#xff1a;gcc main.o -o main 命令汇总&#xff1a;gcc main.c …