c++(三)

news2024/11/17 0:05:49

C++(三)

  • static
    • c语言的static
    • c++中的static
      • static修饰的成员变量
      • static 修饰成员函数
  • const
    • c语言
    • c++
      • const修饰成员变量
      • const修饰的成员函数
      • const修饰的类对象
  • mutable
  • 友元
    • 普通函数作为友元
    • 类的成员函数作为友元
    • 友元类

在这里插入图片描述

static

c语言的static

C语言中static的作用:
1.static修饰的局部变量,延长生命周期,只初始化一次
2.static修饰全局变量(函数),限制了作用域,只能在本文件内使用

c++中的static

static修饰的成员变量

作用:实现成员变量在类中所有的对象之间的 共享

  • 在类内进行声明,类外初始化
    在这里插入图片描述
  • 初始化的格式
数据类型 类名::变量名 = 初始值;

在这里插入图片描述

  • 类中的静态成员变量,不属于某个对象,而是属于类,但是每一个对象都可以访问
  • 访问

1、对象.成员变量
2、指针对象名->成员变量
3、类名::成员变量

#include <iostream>
using namespace std;
/*
* static修饰的成员变量
* 作用:实现成员变量在类中所有对象之间共享
* 1.在类内声明,类外初始化
* 2.初始化格式:类型名 类名::变量名 = 初始值;
* 3.类中的成员变量,不属于某个对象,而属于类,但所有对象都可以访问
* 4.访问:对象.成员变量;指针对象名->成员变量;类名::成员变量
*/

class Student
{
public:
	//构造
	Student(string name = "张三");
	//析构
	~Student();
	void show();
private:
	static int count; //类内声明,类外初始化
	int id;
	string name;
protected:
};
Student::Student(string name)
{
	//访问
	this->id = Student::count++;
	this->name = name;
	cout << "**构造**" << endl;
}
Student::~Student()
{
	cout << "**析构**" << endl;
}
void Student::show()
{
	cout << "学号:" << this->id << ","
		<< "姓名" << this->name << endl;
}
//初始化格式:类型名 类名::变量名 = 初始值;
int Student::count = 1;

int main()
{
	//创建两个对象,看id是否自增
	Student student1("李四");
	student1.show();

	Student student2("王五");
	student2.show();
}

在这里插入图片描述

static 修饰成员函数

作用:实现成员函数的共享

  • 静态成员函数没有this指针
  • 静态成员函数中不能访问非静态成员(成员变量、成员函数)
  • 非静态成员函数可以访问静态成员
  • static修饰的成员函数属于类,但是对象可以去调用
  • 访问

1、对象.成员函数
2、指针对象->成员函数
3、类::成员函数

#include <iostream>
using namespace std;
/*
* static修饰的成员函数
* 作用:实现成员函数的共享
* 静态成员函数没有this指针
* 静态成员函数不能访问非静态成员
* 非静态成员函数可以访问静态成员
* 静态成员的访问:对象名.静态函数;指针对象->静态函数;类::静态函数
*/
class Student
{
public:
	//构造
	Student(string name= "张三");
	//析构
	~Student();
	static void show(Student &demo);
	void show_name();
private:
	static int count;
	int id;
	string name;
protected:
};
Student::Student(string name)
{
	this->id = Student::count++;
	this->name = name;
	cout << "构造" << endl;
}
Student::~Student()
{
	cout << "析构" << endl;
}
void Student::show(Student &demo)
{
	//静态成员函数中不存在指针this
	/*cout << "学号:" << this->id << ","
		<< "姓名:" << this->name << endl;*/
	/*静态成员函数不能访问非静态成员
	show_name();*/
	//传入对象引用来实现输出
	cout << "学号:" << demo.id << ","
		<< "姓名:" << demo.name << endl;

}
void Student::show_name()
{
	//非静态成员函数可以访问静态成员
	cout << "变量:" << Student::count << endl;
	cout << "姓名:" << this->name << endl;
}
int Student::count = 1;

int main()
{
	Student student1("李四");
	student1.show(student1);
	student1.show_name();

	Student student2("王五");
	student2.show(student2);
	student2.show_name();

}

在这里插入图片描述

const

c语言

在C语言中:
const:修饰的只能读不能写
const int a;//栈区
int *p = NULL;
指针常量:int * const p = NULL;//p的指向不能修改
常量指针:int const *p = NULL;//值不能修改
const int const *p = NULL;//值和指向都不能修改

c++

const修饰成员变量

  • const修饰的成员变量只能以初始化列表的形式进行初始化
    在这里插入图片描述

  • 非const修饰的成员变量也可以以初始化列表的方式进行初始化
    在这里插入图片描述

  • const修饰的成员变量只能读不能修改
    在这里插入图片描述

#include <iostream>
using namespace std;
/** const 修饰成员变量
 * const修饰的成员变量只能以初始化列表的形式初始化
 * 非const修饰的成员变量也可以用初始化列表的形式初始化
 * const修饰的成员变量只能读不能修改
*/
class Student
{
public:    
	//构造    
	Student(int id = 1, string name = "张三", string sex = "女");    
	//析构    
	~Student();    
	void show();    
	void set_id(int id);private:    
	const int id;    
	string name;    
	string sex;
protected:
};
Student::Student(int id, string name, string sex):id(id),sex(sex)//非const修饰的成员变量也可以以初始化列表的形式初始化
{    
	/*const 修饰的成员变量必须以初始化列表的形式初始化    this->id = id;*/    
	this->name = name;    
	cout << "构造" << endl;
}
Student::~Student()
{    
	cout << "析构" << endl;
}
void Student::show()
{    
	cout << "学号:" << this->id << ","        			
	<< "姓名:" << this->name <<","        
	<< "性别:" << this->sex << endl;
}
void Student::set_id(int id)
{    
	/*const 修饰的成员变量不能修改    this->id = id;*/
}int main()
{    
	Student student1;    
	student1.show();​    
	Student student2(2, "李四", "男");    
	student2.show();
}

在这里插入图片描述

const修饰的成员函数

  • 本质:const修饰的成员函数本质上是修饰成员函数中的第一个隐藏参数this指针
void Student::set_address(string address)
//Student * const this
{
}
void Student::set_address(string address) const
//const Student * const this
{
}
  • const修饰的成员函数中,成员变量的值不能修改
    在这里插入图片描述
  • 互为重载

在这里插入图片描述

  • 非const修饰的成员函数可以访问const修饰的成员
    在这里插入图片描述
  • const修饰的成员函数不可以访问非const修饰的成员函数
    在这里插入图片描述
#include <iostream>
using namespace std;
/*
* const 修饰成员函数实质上修饰的是成员函数第一个参数this
* const 修饰的成员函数不可以修改成员变量
* const 修饰的成员函数不可以访问非const修饰的成员函数
* 非const 修饰的成员函数可以访问const修饰的成员
* const 修饰的成员函数与非const修饰的成员函数互为重载
*/
class Student
{
public:
	Student(int id = 1, string name = "张三", string sex = "女");
	~Student();
	void show();
	void set_name(string name) const;
	void set_name(string name);
	void show_name() const;
private:
	const int id;
	string name;
	string sex;
protected:
};
Student::Student(int id, string name, string sex) :id(id), sex(sex)
{
	this->name = name;
	cout << "构造" << endl;
}
Student::~Student()
{
	cout << "析构" << endl;
}
void Student::show()
{
	this->show_name();
	cout << "学号:" << this->id << "," //非const修饰的成员函数可以访问const修饰的成员
		<< "姓名:" << this->name << ","
		<< "性别:" << this->sex << endl;
}
void Student::set_name(string name) const //const Studnet * const this;指向和值都不可改变
{
	/*const修饰的成员函数不可以修改成员变量
	this->name = name;*/
	//const修饰的成员函数可以访问非const修饰的成员变量
	cout << this->name << endl;
	/*const 修饰的成员函数不可以访问非const修饰的成员函数
	this.show();*/
}
void Student::set_name(string name)//Student * const this;const修饰的成员函数与非const修饰的成员函数互为重载
{
	this->name = name;
}
void Student::show_name() const
{
	cout << this->name << endl;
}

int main()
{
	Student student1(2, "李四", "男");
	student1.show();
	
}

在这里插入图片描述

const修饰的类对象

  • const修饰类对象之后只能访问const修饰的函数
#include <iostream>
using namespace std;
/*
* const 修饰的类对象
* 只能访问const修饰的成员函数
*/

class Student
{
public:
	Student(int id = 1, string name = "张三");
	~Student();
	void show() const;
	void set_name(string name);
private:
	const int id;
	string name;
protected:
};
Student::Student(int id, string name):id(id)
{
	this->name = name;
	cout << "构造" << endl;
}
Student::~Student()
{
	cout << "析构" << endl;
}
void Student::show() const
{
	cout << "学号:" << this->id << ","
		<< "姓名:" << this->name << endl;
}
void Student::set_name(string name)
{
	this->name = name;
}

int main()
{
	const Student student1;
	student1.show();
	/*const 修饰的类对象,类对象不能访问const修饰的成员变量
	cout << student1.id << endl;*/
	/*const 修饰的类对象,类对象只能访问const修饰的成员函数
	student1.set_name();*/
	return 0;
}

在这里插入图片描述

mutable

  • 打破了const的限制
  • const修饰的成员函数中,成员变量的值不能被修改
  • 一般情况下不要使用,除非破不得已
    在这里插入图片描述
    在这里插入图片描述
#include <iostream>
using namespace std;
/*
* mutable 打破const
* 使得const修饰的成员函数可以修改mutable修饰的成员变量
*/
class Student
{
public:
	Student(int id = 1, string name = "张三");
	~Student();
	void show();
	void set_name(string name) const;
private:
	const int id;
	mutable string name;
protected:
};
Student::Student(int id, string name) :id(id)
{
	this->name = name;
	cout << "构造" << endl;
}
Student::~Student()
{
	cout << "析构" << endl;
}
void Student::show()
{
	cout << "学号:" << this->id << ","
		<< "姓名:" << this->name << endl;
}
void Student::set_name(string name) const
{
	//const 修饰的函数可以修改mutable修饰的成员变量
	this->name = name;
}

int main()
{
	Student student1;
	student1.show();
	student1.set_name("李四");
	student1.show();
	return 0;
}

在这里插入图片描述

友元

  • 友元打破了private、protected的限制
  • 私有的(受保护的)成员变量要访问在public区提供函数接口去访问的;如果访问的次数少,没有关系;如果访问的比较频繁,对系统消耗比较多;如果能直接访问的话大大提高了效率
  • 关键字:friend

普通函数作为友元

在这里插入图片描述

#include <iostream>
using namespace std;
/*
* 友元 打破private,protected
* 普通函数作为友元函数:使得普通函数可以操作类中的私有成员变量
*/
class Student
{
public:
	Student(int id = 1, string name = "张三");
	~Student();
	void show();
	friend void set_get_name(Student &denmo, string name);
private:
	int id;
	string name;
protected:
};
Student::Student(int id, string name) :id(id)
{
	this->name = name;
	cout << "构造" << endl;
}
Student::~Student()
{
	cout << "析构" << endl;
}
void Student::show()
{
	cout << "学号:" << this->id << ","
		<< "姓名:" << this->name << endl;
}
void set_get_name(Student &demo, string name)
{
	cout << "原始name:" << demo.name << endl;
	demo.name = name;
	cout << "修改后name:" << demo.name << endl;
}

int main()
{
	Student student1;
	set_get_name(student1, "王五");
	return 0;
}

在这里插入图片描述

类的成员函数作为友元

问题
在这里插入图片描述
解决:在类内声明,类外定义
在这里插入图片描述

#include <iostream>
using namespace std;
/*
* 友元 打破private,protected
* 类的成员函数作为友元函数:使得类的成员函数可以操作类中的私有成员变量
* 先声明,在类外定义
*/
class Student;
class Tea
{
public:
	void set_get_name(Student& demo, string name);
private:
	
protected:
};
class Student
{
public:
	Student(int id = 1, string name = "张三");
	~Student();
	void show();
	friend void Tea::set_get_name(Student& denmo, string name);
private:
	int id;
	string name;
protected:
};
Student::Student(int id, string name) :id(id)
{
	this->name = name;
	cout << "构造" << endl;
}
Student::~Student()
{
	cout << "析构" << endl;
}
void Student::show()
{
	cout << "学号:" << this->id << ","
		<< "姓名:" << this->name << endl;
}
void Tea::set_get_name(Student& demo, string name)
{
	cout << "原始name:" << demo.name << endl;
	demo.name = name;
	cout << "修改后name:" << demo.name << endl;
}

int main()
{
	Student student1;
	Tea tea;
	tea.set_get_name(student1, "王五");
	return 0;
}

在这里插入图片描述

友元类

  • 当A类中有多个成员函数要访问B类中的私有成员变量时
#include <iostream>
using namespace std;
/*
* 友元 打破private,protected
* 类的成员函数作为友元函数:使得类的成员函数可以操作类中的私有成员变量
* 先声明,在类外定义
*/
class Student;
class Tea
{
public:
	void set_get_name(Student& demo, string name);
	void get_id(Student& demo);
private:

protected:
};
class Student
{
public:
	Student(int id = 1, string name = "张三");
	~Student();
	void show();
	friend class Tea;
private:
	int id;
	string name;
protected:
};
Student::Student(int id, string name) :id(id)
{
	this->name = name;
	cout << "构造" << endl;
}
Student::~Student()
{
	cout << "析构" << endl;
}
void Student::show()
{
	cout << "学号:" << this->id << ","
		<< "姓名:" << this->name << endl;
}
void Tea::set_get_name(Student& demo, string name)
{
	cout << "原始name:" << demo.name << endl;
	demo.name = name;
	cout << "修改后name:" << demo.name << endl;
}
void Tea::get_id(Student& demo)
{
	cout << "id:" << demo.id << endl;
}

int main()
{
	Student student1;
	Tea tea;
	tea.set_get_name(student1, "王五");
	tea.get_id(student1);
	return 0;
}

在这里插入图片描述

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

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

相关文章

【test】Windows11下通过sshfs挂载远程服务器目录

下载安装下面三个软件&#xff1a; sshfs-win&#xff1a;https://github.com/billziss-gh/sshfs-win/releases winfsp&#xff1a;https://github.com/billziss-gh/winfsp/releases SSHFS-Win Manager&#xff1a;https://github.com/evsar3/sshfs-win-manager/releases 安装…

增强ev代码签名证书2300

代码签名证书是软件开发者们确保软件完整性和安全性的重要工具之一。在各种类型的代码签名证书中&#xff0c;增强EV代码签名证书拥有许多独特的功能而受到企业开发者的欢迎&#xff0c;今天就随SSL盾小编了解增强EV代码签名证书的申请条件以及申请流程。 1.增强型EV代码签名证…

Linux——Dockerfile

在这里我们来整理一下docker容器、dockerfile、docker镜像的关系&#xff1a; dockerfile是面向开发的&#xff0c;发布项目做镜像的时候就要编写dockerfile文件。 dockerfile&#xff1a;构建文件&#xff0c;定义了一切的步骤&#xff0c;源代码。 dockerImanges&#xff1a…

【AI绘画Stable Diffusion】单人LoRA模型训练,打造你的专属模型,新手入门宝典请收藏!

大家好&#xff0c;我是灵魂画师向阳 本期我将教大家如何进行LoRA模型训练&#xff0c;打造你的专属模型&#xff0c;内容比较干&#xff0c;还请耐心看完&#xff01; 随着AIGC的发展&#xff0c;许多传统工作岗位正逐渐被AI取代。同时&#xff0c;AI变革也在创造前所未有的…

STM32 学习——1. STM32最小系统

这是一个最小系统的测试&#xff0c;LED灯会进行闪烁。选用PC13口&#xff0c;因为STM32F103C8T6 硬件开发板中&#xff0c;这个端口是一个LED 1. proteus8.15 原理图 2. cubemx 新建工程 3. keil 代码 while (1){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);HAL_Delay(100);…

《计算机网络微课堂》1-3 三种交换方式

本节课我们介绍三种交换方式&#xff0c;分别是电路交换&#xff08;Circuit Switching&#xff09;&#xff0c;分组交换&#xff08;Packet Switching&#xff09;以及报文&#xff08;Message Switching&#xff09;交换。 我们首先来看电路交换&#xff0c;在电话问世后不…

探索未来,与移动云共舞

探索未来&#xff0c;与移动云共舞 在数字化飞速发展的今天&#xff0c;云计算已经成为企业、政府乃至个人用户不可或缺的一部分。而在众多云服务提供商中&#xff0c;移动云凭借其独特的优势&#xff0c;为用户带来前所未有的体验。接下来&#xff0c;让我们一起走进移动云的世…

Python--List列表

list列表⭐⭐ 1高级数据类型 Python中的数据类型可以分为&#xff1a;数字型&#xff08;基本数据类型&#xff09;和非数字型&#xff08;高级数据类型&#xff09; ●数字型包含&#xff1a;整型int、浮点型float、布尔型bool、复数型complex ●非数字型包含&#xff1a;字符…

Python实现数据可视化效果图总结

一、JSON格式 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据。 JSON本质上是一个带有特定格式的字符串 Json格式 JSON数据格式在Python中可以是字典、又可以是列表中嵌套着字典的格式。 Pyhton数据和Json数据相互转化 二、pyecharts模块 如果想…

SpringMVC接收请求参数的方式:

接收简单变量的请求参数 直接使用简单变量作为形参进行接收&#xff08;这里简单变量名称需要与接收的参数名称保持一致&#xff0c;否则需要加上RequestParam注解&#xff09;&#xff1a; 细节&#xff1a; 1&#xff1a;SpringMVC会针对常见类型&#xff08;八种基本类型及…

翻译《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 标志的重要性 简要 文章讨论了使用FormatMes…

数据结构----堆的实现(附代码)

当大家看了鄙人的上一篇博客栈后&#xff0c;稍微猜一下应该知道鄙人下一篇想写的博客就是堆了吧。毕竟堆栈在C语言中常常是一起出现的。那么堆是什么&#xff0c;是如何实现的嘞。接下来我就带大家去尝试实现一下堆。 堆的含义 首先我们要写出一个堆&#xff0c;那么我们就需…

nodejs 与 npm 版本对应关系

官方地址&#xff1a;https://nodejs.org/en/about/previous-releases

手机边听边充音频转接器双盲插系列:便捷充电,畅享音乐6500

在快节奏的生活中&#xff0c;手机已经成为我们不可或缺的日常用品。无论是工作、学习还是娱乐&#xff0c;手机都扮演着重要角色。然而&#xff0c;当我们沉浸在音乐的海洋中时&#xff0c;手机电量不足的困扰却时常打断我们的美好体验。为了解决这一难题&#xff0c;手机边听…

你真正了解 Java 中的 Date 类吗?以及如何正确使用它

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

设计模式8——原型模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 原型模式&#xff08;Prototyp…

css卡片横线100%宽度

所需样式: 横线不用border, 用单独一个div, 这样就不会影响父组件的padding <div class"pumpDetailView"><div class"pump_title_name"><span>{{ pumpInfo.pointname }}</span><divclass"point_state":style"…

vr商品全景展示场景编辑软件的优点

3D模型展示网站搭建编辑器以强大的3D编辑引擎和逼真的渲染效果&#xff0c;让您轻松实现模型展示的优化。让用户通过简单的操作&#xff0c;就能满足个人/设计师/商户多样化展示的需求&#xff0c;让您的模型成为独一无二的杰作。 3D模型展示网站搭建编辑器采用国内领先的实时互…

玩转盲盒潮流:从0到1搭建小程序平台

在当前的消费市场中&#xff0c;盲盒已成为一种炙手可热的消费模式&#xff0c;凭借其神秘性和随机性&#xff0c;迅速俘获了年轻消费者的心。作为一位有志于创新并紧跟市场趋势的创业者&#xff0c;你可能会想&#xff1a;如何从0到1搭建一个属于自己的盲盒小程序平台&#xf…

kafka跨地区跨集群同步工具MirrorMaker2 —— 筑梦之路

MM2简介 KIP-382: MirrorMaker 2.0 - Apache Kafka - Apache Software Foundation 有四种运行MM2的方法&#xff1a; As a dedicated MirrorMaker cluster.&#xff08;作为专用的MirrorMaker群集&#xff09; As a Connector in a distributed Connect cluster.&#xff08…