C++基础(三)

1.再探构造函数

之前的构造函数,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔开的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式

	Date(int year, int month, int day)
	
		:_year(year)
		, _month(month)
		, _day(day)
	{}

每个成员变量在初始化列表只出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方

引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否者编译报错

//text.cpp
#include<iostream>
using namespace std;

class Date
{
public:
	Date(int& xx, int year, int month, int day)

		:_year(year)
		, _month(month)
		, _day(day)
//引用类型,静态变量初始化,没给默认构造,系统虽然自动生成,还是会走初始化列表
		 ,_n (1)
		,_ref(xx)

	{}
	
private:
	
	//声明
	int _year;
	int _month;
	int _day;
	const int _n;
	int& _ref;
};


int main()
{
	int xx = 5;
	//对象定义
	Date d1(xx, 2024,7, 15);
	
	return 0;
}
  • C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的
//text.cpp
#include<iostream>
using namespace std;

class Time
{
public:
	Time(int hour)
		:_hour(hour)
	{
		//cout << "Time()" << endl;
	}

private:
	int _hour;
};

class Date
{
public:
	Date(int& xx, int year, int month, int day)

		:_year(year)
		, _month(month)
	
	{}	

void	Print()
	{
	cout << _year <<" " << _month <<" " << _day << endl;
	}
private:

	//声明 ,缺省值->初始化列表用的
	int _year=1;
	int _month=1;
	int _day=1;
Time  _t= 1;
};


int main()
{
	//对象定义
	Date d1(xx, 2024,7, 15);
	d1.Print();
	return 0;
}

 初始化列表有的用初始化列表给的值,没有则走默认构造的缺省值。初始列表没给_day赋值,但是声明时赋了缺省值,所以对象声明时即便给了_day=15,但是初始化列表并没有对_day赋值 所以_day初始化为了1

尽管使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表就会使用这个缺省值,如果你没有给缺省值,对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译报错

总结:

每个成员都要走初始化列表

  1. 在初始化列表的成员
  2. 没有在初始化列表的成员

         a.声明的地方有缺省值

         b 没有缺省值

               x :内置类型,不确定,看编译器,大概率是随机值

               y:自定义类型,调用默认构造函数,没有默认构造就报错

      3.引用const 没有默认构造自定义 ,必须在初始化列表完成初始化

初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关,建议顺序和初始化保持一致

//text.cpp
#include<iostream>
using namespace std;

class A
{
public:
	A(int a)
		:_a1(a)
		,_a2(_a1)
	{}
	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a1=2;
	int _a2=2;
};




int main()
{
	A aa(1);
	aa.Print();
	return 0;
}

 _a2先声明,但是用_a1初始化_a2显然不合理,C++中给变量开内存的顺序跟变量声明一致,所以这里_a2给的是随机值,_a1是1

 2.static

静态成员函数可以为所有成员所共享,不属于莫格具体的对象,不存在对象中,存放在静态区

//text.cpp
#include<iostream>
using namespace std;

class A
{
public:
	A(int a)	
	{}
	~A()
	{}
private:
//类内声明
static	int _a;
	
};

int main()
{
	//计算A的大小
	cout << sizeof(A) << endl;
	return 0;
}

 用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化

//类外初始化
int A::_a = 1;
  • 用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针
  • 静态成员函数中可以访问其他的静态成员,但不能访问非静态的,因为没有this指针
  • 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数
class A
{

	static int Getint()
	{
		//不能访问非静态的成员变量,编译器报错,因为静态成员函数没有this指针
		a++;
	}
private:
	int a;
static	int _a;
	
};
  • 突破类域就可以访问静态成员,可以通过类名::静态成员或者 对象.静态成员来访问静态成员变量和静态成员函数
  • 静态成员也是类的成员,受public,protected,private访问限定符的限制
  • 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是给构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表

3.友元

class A

{    //前置声明,否者A的友元函数声明编译器不认识B
	class B;
	//友元函数声明
	friend void func(const A&aa,const B&bb);
	//友元类声明
	friend class B;
private:
	int a;
static	int _a;
	
};
class B
{
};
  • 友元提供一种突破访问限定符封装的方式,友元分为友元函数和友元类,在函数声明或者类声明的前面加friend,并把友元声明放到一个类的里面
  • 外部友元函数可访问类的私有和保护成员,友元函数仅仅是一种声明,他不是类的成员函数
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元类的成员函数都可以是另一个类的友元函数,都可以访问另一个类的私有和保护成员
  • 友元类的关系是单向的,不具有交换性,比如A类是B类的友元,但是B类不是A类的友元
  • 友元类关系不能传递,如果A是B的友元,B是C的友元,但是A不是B的友元
  • 为了提供便利,但是友元会增加耦合度,破坏了封装,所以友元不适合多用

4.内部类

//text.cpp
#include<iostream>
using namespace std;

class A
{public:
	class B {//B默认是A的友元,B可以睡衣访问A
	public:
		void foo(const A& a)
		{
			cout << _k << endl;//ok
			cout << a._h << endl;//ok
		}
	private:
		int _b = 1;
	};
 
private:
	int _h=1;
static	int _k;
	
};


int main()
{
	cout << sizeof(A) << endl;

	return 0;
}

  •  如果一个类定义在另一个类的内部,这个内部类就叫做内部类,内部内是一个独立的类,跟定义在全局相比,他只是受外部类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类

  • 内部类默认是外部类的友元,可以随意访问
  • 内部类本质也是一种封装,当A类跟B类关系紧密,A类实现出来主要就是给B类使用的,那么就可以考虑把A类设计成B类的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了

5.匿名对象

//有名对象

A aa1;
A  aaa(1);
//可以这样定义类
A a11();
//不能这样定义,会产生歧义,编译器不知道这是函数声明还是定义类

//匿名对象
A();
A(1);

用类型(实参)定义出来的对象叫匿名对象,相比之前的定义的类型对象名(实参)定义出来的叫友名对象

匿名对象声明周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象

//text.cpp
#include<iostream>
using namespace std;

class A
{public:
	
	A(int a=0)
	{
	}
	~A()
	{}
	string Print()
	{
		return "2024-7-15";
}
	
};


int main()
{//定义在使用
	A a;
	cout << a.Print() << endl;
	//直接匿名使用
	cout << A().Print() << endl;

	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected identifier

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的标点符号2. 使用了不正确的标识符3. 关键词拼写错误4. 变量名与保留字冲突 四、解决方案与预防措施1. 检查和添加必要的标点符号2. 使用正确的标识符3. 检查关键词拼写4. 避免使用保留字作为变量名…

C# 解析省份、城市、区域 json文件

一、json文件内容如下&#xff0c;&#xff08;小程序里好像有用到...&#xff09;: 二、读取包含省份城市区域的json文件&#xff0c;并整理成想要的结果&#xff1a; string path Server.MapPath("/js"); string file System.IO.Path.Combine(path, "数据.…

数字孪生技术在元宇宙的应用

数字孪生技术与元宇宙有着天然的契合性&#xff0c;两者在技术、应用场景等方面都具有高度的互补性。数字孪生技术可以为元宇宙提供逼真、实时的数据模型和场景&#xff0c;而元宇宙可以为数字孪生技术提供广阔的应用平台和场景。北京木奇移动技术有限公司&#xff0c;专业的软…

从零开始学习深度学习库-5:自动微分(续)

引言 欢迎来到这个从头开始构建深度学习库系列的第5部分。这篇文章将介绍库中自动微分部分的代码。自动微分在上一篇文章中已经讨论过了&#xff0c;所以如果你不知道自动微分是什么&#xff0c;请查看一下。 自动微分系统的核心是计算图&#xff0c;这是一种有向图&#xff…

仅在少数市场发售?三星Galaxy Z Fold 6 Slim折叠屏手机更轻更薄

在智能手机的创新之路上&#xff0c;三星一直是行业的领跑者之一。随着Galaxy Z Fold系列的不断进化&#xff0c;三星再次突破技术边界&#xff0c;推出了更为轻薄的Galaxy Z Fold 6 Slim。 这款新型折叠屏手机以其独特的设计和卓越的性能&#xff0c;为用户带来了全新的使用体…

浅谈RLHF---人类反馈强化学习

浅谈RLHF&#xff08;人类反馈强化学习&#xff09; RLHF&#xff08;Reinforcement Learning fromHuman Feedback&#xff09;人类反馈强化学习 RLHF是[Reinforcement Learning from Human Feedback的缩写&#xff0c;即从人类反馈中进行强化学习。这是一种结合了机器学习中…

java实现资产管理系统图形化用户界面

创建一个&#x1f495;资产管理系统的GUI&#xff08;图形用户界面&#xff09;❤️画面通常需要使用Java的Swing或者JavaFX库。下面我将提供一个简单的资产管理系统GUI的示例代码&#xff0c;使用Java Swing库来实现。这个示例将包括一个主窗口&#xff0c;一个表格来显示资产…

SD card知识总结

一、基础知识 1、简介 SD Card 全称(Secure Digital Memory Card)&#xff0c;日本电子公司松下&#xff08;Panasonic&#xff09;、瑞典公司爱立信&#xff08;Ericsson&#xff09;、德国公司西门子&#xff08;Siemens&#xff09;共同开发的&#xff0c;于1999年发布根…

网络文件系统—NFS

目录 一、概述 二、NFS挂载原理 三、NFS相关协议及软件安装管理 1.协议&#xff1a; 2.软件&#xff1a; 四、NFS系统守护进程 五、NFS服务器的配置 六、NFS服务器的启动与停止 1. 启动NFS服务器 2.查询NFS服务器状态 3.停止NFS服务器 4.设置NFS服务器的自动启动状…

Redis的配置优化、数据类型、消息队列

文章目录 一、Redis的配置优化redis主要配置项CONFIG 动态修改配置慢查询持久化RDB模式AOF模式 Redis多实例Redis命令相关 二、Redis数据类型字符串string列表list集合 set有序集合sorted set哈希hash 三、消息队列生产者消费者模式发布者订阅者模式 一、Redis的配置优化 redi…

【java计算机毕设】网上购书管理系统MySQL servlet JSP项目设计源代码 期末寒暑假作业 小组作业

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】网上购书管理系统MySQL servlet JSP项目设计源代码 期末寒暑假作业 小组作业 2项目介绍 系统功能&#xff1a; servlet网上购书管理系统包括管理员、用户两种角色。 管理员功能包括订单管理&#xff08;已…

pytorch中一些最基本函数和类

1.Tensor操作 Tensor是PyTorch中最基本的数据结构&#xff0c;类似于NumPy的数组&#xff0c;但可以在GPU上运行加速计算。 示例&#xff1a;创建和操作Tensor import torch# 创建一个零填充的Tensor x torch.zeros(3, 3) print(x)# 加法操作 y torch.ones(3, 3) z x y pr…

放大电路中的反馈

一、基本概念 根据反馈的效果可以区分反馈的极性&#xff0c;使基本放大电路净输入量增强的反馈为正反馈&#xff0c;使基本放大电路净输入量减弱的反馈为负反馈。 二、判断反馈极性 瞬时极性法&#xff1a;首先规定电路输入信号在某一时刻对地的极性&#xff0c;并逐级判断电…

Arch升级后启动变慢

systemd-analyze blame refector.service 耗时2分钟&#xff01; 安全检查&#xff1a;检测镜像速度排序写入源&#xff0c;这个更新时运行不就行了&#xff0c;没必要每次启动时运行啊&#xff01; 禁止服务&#xff1a;systemctl disable reflector.service

【C++】——类和对象(上)

文章目录 什么是类和对象类的定义类的访问限定符及其封装类的作用域类的实例化类的对象的大小计算this指针 什么是类和对象 类是一个用户定义的类型&#xff0c;它封装了数据&#xff08;称为属性或成员变量&#xff09;和操作这些数据的方法&#xff08;称为成员函数或方法&a…

23种设计模式之责任链模式

责任链模式 1、定义 避免将一个请求的发送者与接受者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接受请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有一个对象能够处理它为止 2、责任链模式结构 Handler(抽象处理者)&#xff1a;定…

事务ACID四大特性(图文详解~)

ACID ACID 是数据库管理系统中保证事务正确执行的四大特性的缩写。 1. Atomicity&#xff08;原子性&#xff09;&#xff1a; 原子性指事务是不可分割的单位&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。—All or nothing. 通常使用日志记录机制来启动回滚功…

Linux 磁盘扩容

centos7 磁盘扩容 yum install -y cloud-utils-growpart 1.扩容vda 1 growpart /dev/vda 1 2.以 resize2fs 格式 resize2fs /dev/vda1 df -TH

机器学习开源分子生成系列(2)-基于三维形状和静电相似性的DeepFMPO v3D安装及使用

前言 本文是基于 3D 的分子生成方法DeepFMPO v3D的介绍及安装使用。 一、DeepFMPO v3D是什么&#xff1f; github代码介绍文章 在药物发现中&#xff0c;如何寻找具新颖性和结构多样性的候选分子是颇受药物设计科学家关注的问题。通过虚拟筛选的化学空间搜索往往会受限于筛选…

软件设计师(中级)备考视频教程

一、视频介绍 本视频主要包括软件设计师系统学习教程&#xff0c;通过学习本视频&#xff0c;可以帮助考生高效且深入地掌握软件设计师资格考试核心知识&#xff0c;全方位覆盖考试要点&#xff0c;从而轻松备战考试。视频不仅涵盖了考试所需的全面知识体系&#xff0c;还通过直…