一起学习 05特殊成员 C++

C++类:类中的静态属性和函数、常量函数与常对象、类在内存中的存储 静态属性 静态成员包括静态成员属性、静态成员函数。 一个属性一旦设置为静态,那么整个程序中就独其一份。 如上所示,之前p.m_A的值是100。使用p2.m_A更改了该值为200后,即使再用p.m_A去调用,结果仍是200。 静态属性会在代码运行前的编译阶段就生成并保持存在全局区。静态属性和静态成员函数都不算在类内,都是保存在别的区域(全局区)。 静态属性必须要有一个初始值,可以在类内声明,类外初始化。 类内声明: 类外初始化: Person::表示这个变量是在person作用. 阅读详情

特殊成员

const 成员

  • const数据成员
    • const类型变量是不可以修改,只读模式
    • 必须采用初始化参数列表方式进行初始化
#include<iostream>
#include<string>
using namespace std;
class MM {
public:
	MM(string name,int num) :num(num) {
		MM::name = name;   //可以用,也可以不用初始化列表
		//MM::num = 1001; wrong必须要用初始化参数列表方式初始化
	}
protected:
	const int num;
	string name;
};
int main() {
	MM mm("YY", 22);
	while (1);
	return 0;
}

在这里插入图片描述

  • const成员函数
    • 写法上, const写在函数后面
    • 常成员函数是不能够修改数据成员,只读数据成员
    • 常成员函数可以与普通函数同时存在
      • 普通函数和常成员函数相同时,普通对象优先调用普通函数
      • 普通对象可以调用常成员函数
  • const对象: const修饰的对象
    • 常对象只能调用常成员函数
#include<iostream>
#include<string>
using namespace std;
class MM {
public:
	MM(string name,int num) :num(num) {
		MM::name = name;   //可以用,也可以不用初始化列表
		//MM::num = 1001; wrong必须要用初始化参数列表方式初始化
	}
	void print()
	{
		//num = 1122;
		cout << name << " " << num << endl;
	}
	void print() const
	{
		//name = "HH";常成员函数 不可修改数据
		//num = 2233;
		cout << "Im const funcction,Icant change data\n" << endl;
	}
	void printdata()
	{
		cout << name << "Im ordinary funnction" << num << endl;
	}
protected:
	const int num;
	string name;
};
int main() {
	MM mm("YY", 22);
	mm.print();            //普通对象调用普通函数
	const MM m("TT", 21);
	m.print();        //常对象调用常成员函数
	//m.printdata()   //错误!,常对象只能调用普通函数
	while (1);
	return 0;
}

在这里插入图片描述

static成员

  • static成员是不属于对象,是属于类的
    <意味着是所有对象共有的>
    调用可以不需要对象,当然你可以用对象调用

  • static成员依旧受权限限定。

  • static数据成员

    • $$$必须在类外初始化,不再需要static修饰,但是需要类名限定
    • 类中初始化是错误的,不能采用初始化参数列表方式初始化
#include"iostream"
#include<string>
using namespace std;
class Boy {
public:
	//+必须在类外初始化,不再需要static修饰,但是需要类名限定
	//+ 类中初始化是错误的,不能采用初始化参数列表方式初始化
	Boy(string name = "") :name(name) {
		//Boy::name = name; 可以不写
		num++;
	}
	void print() {
		cout << name << " " << num << endl;
	}
protected:
	static int num;
	string name;
};
//类外初始化,不再需要static修饰,但是需要类名限定
int Boy::num = 22;
int main() {
	Boy boy("boy");
	boy.print();
	while (1);
	return 0;
}

在这里插入图片描述

  • static成员函数
    • static写在函数前面即可
    • 调用非静态成员 必须要指定对象
  • static对象
    • 释放是最后释放的
 #include"iostream"
#include<string>
using namespace std;
class Boy {
public:
	//+必须在类外初始化,不再需要static修饰,但是需要类名限定
	//+ 类中初始化是错误的,不能采用初始化参数列表方式初始化
	Boy(string name = "") :name(name) {
		//Boy::name = name; 可以不写
		num++;
	}
	void print() {
		cout << name << " " << num << endl;
	}
	static void printboy();
	static void printbo(Boy& Bo)
	{
		cout << "内部static函数" << Bo.name << " " << Bo.num << endl;
	}
public:
	static int num;
	string name;
};
//类外初始化,不再需要static修饰,但是需要类名限定
int Boy::num = 22;
//类外初始化,不再需要static修饰
void Boy::printboy()
{
	cout << "Im static function" << endl;
	// 不这样写,写下面方法   不行 Boy::printboy()
	//cout << Boy.name << " " <<Boy. num << endl;  错误!!!
	//cout << Boy::name << name << num << endl; !!!!!!!name Cant print!
	cout << num << endl;
}
int main() {
	//访问静态数据成员 可以不需要 对象
	cout << Boy::num << endl;//22
	Boy::printboy();// 此出 意外发现调用static 函数可以不用对象???22
	// 证明 static 数据成员是共有
	Boy bo("bo");//22

	//静态数据成员可以通过对象去访问
	cout << bo.num << endl;// num 为23
	Boy Bo[4];  // num 23+4
	cout << Bo->num << endl;
	Boy* b = new Boy("newboy");//27+1

	cout << Boy::num << endl;
	cout << b->num << endl;
	cout <<bo.num << endl;
     delete b;
	 b = nullptr;

	//静态成员函数
	 Boy::printboy();
	 bo.printboy();
     Boy::printbo(bo);
	while (1);
	return 0;
}

在这里插入图片描述

友元

<202111281:12>明天补
描述关系:
给对象发放特许牌,让他有特权访问
赋予对象具有打破类的权限定(无视权限)

  • 友元函数
    • 普通友元函数
    • 以另一个类的成员函数充当友元函数,顺序如下:
      • B 类{function}
      • A类
      • A类的 友元函数function
#include"iostream"
#include<string>
using namespace std;
class A {
public:
    A(string name, int num) :name(name), num(num) {}

         void print() {
		 cout << "Im function of A" << endl;
         cout << name << "" << num << endl;
         }
protected:
    string name;
private:
    int num;
    friend  void printData2(A& mm);
};
void printData2(A& mm)// friend function
{
    cout << mm.name << "\t" << mm.num << endl;
}
int main() {
    A aa("AA", 23);
    aa.print();
    printData2(aa);// friend function
    while (1);
    return 0;
}

在这里插入图片描述

友元类
  • 1.在A 中 标识 B为朋友
    并在A内就写 构造和数据成员
  • 2 .B中创建 A 的对象或者 传进来 访问打印
    互为友元类:可以互相访问
#include <iostream>
class AA
{
	friend class BB;                      // BB 为AA朋友,他可以访问AA的成员
public:
	AA(string name, int age) :name(name), age(age) {}
protected:
	string name;
	int age;
};
class BB
{
public:
	void print()
	{
		AA aa("aa", 22);
		cout << aa.name << "\t" << aa.age << endl;
	}
	void printAA(AA& aa)
	{
		cout << aa.name << "\t" << aa.age << endl;
	}
	AA& returnAA(AA& aa)
	{
		return aa;
	}
protected:
};
//互为友元类的写法
class A
{
	friend class B;
public:
	void printData();
protected:
	string data ="A";
};

class B
{
public:
	friend class A;
	void printData()
	{
		A a;
		cout << a.data << endl;
	}
protected:
	string data="B";
};
void A::printData()
{
	B b;
	cout << b.data << endl;
}
int main()
{
	AA aa("aa", 23);
	
	BB bb;
	bb.print();//B里创建打印aa       //   BB 为AA朋友,他可以访问AA的成员
	bb.printAA(aa);// 在B 里访问 打印A    BB 为AA朋友,他可以访问AA的成员
	//cout << bb.returnAA(aa).name << endl;  错误,出了友元类,没有权限

	//互为友元
	B b;
	b.printData();
	A a;
	a.printData();
	return 0;
}

在这里插入图片描述

this指针与explicit

  • explicit修饰的构造函数使用,不让隐式转换构造

  • this指针

    • 避免形参名和数据成员同名,通指对象的地址
    • 充当函数返回值,返回对象自身,用*this表示对象本身
    • 静态成员函数中是不能使用this指针!!!
      在这里插入图片描述
#include<iostream>
#include<string>
using namespace std;
class AA {
public:
	AA(string name, int age) {
		this->name = name;//  出别 同名形参 和数据成员
		this->age = age;
	}
	void print() {
		cout << (*this).name << '\t' << (*this).age << endl; // this 取 * 运算为对象自己
	}
	    friend void printdata(AA&a);
const	friend void printdata2(AA& a);
protected:
	int age;
	string name;
};

void printdata(AA& a) {
	cout << a.name << "   friend"<<'\t' << endl;
}
const void printdata2(AA& a) {
	cout << /*this.name */a.name<< a.age << '\t' << endl;
}
int main() 
{
	AA a("A", 22);
	a.print();
	printdata(a);
	cout << "In const function cant use this" << endl;
	printdata2(a);

	while (1);
	return 0;
}

在这里插入图片描述

总结

  • 普通函数不存在初始化参数列表
  • explicit MM(int age) :age(age) {} void print() { cout << age << endl; }//
    //explicit 不让隐式转换构造
    //MM mm = 12;
    //MM temp = 1.33;
    ****** 物理考的很烂,复变函数 也差,英语还行
    期末好好努力,还有一个月。
    希望 Mycoding 和专业学习兼并行加油!在这里插入图片描述
利用gprMax与Matlab实现SFCW雷达信号的高效仿真与优化 本文详细介绍了如何结合gprMax与Matlab实现SFCW雷达信号的高效仿真与优化。通过利用gprMax获取地下场景的冲激响应,并在Matlab中运用卷积与信号处理技术,可大幅提升SFCW雷达系统仿真的效率与灵活性,为探地雷达研究与设计提供强大工具。 阅读详情

相关推荐

如何制作DOS启动盘 U盘制作DOS启动盘 HP-U盘启动DOS7 详细步骤教程 Intel网卡使用软件 bootutil lanconfig eeupdate Intel网卡修改MAC地址教程

制作DOS启动盘不是一项复杂的任务,只要按照以下简单的步骤进行操作,您就可以自己动手制作一个DOS启动盘。

lcy524514826的博客 896

C++学习--类的静态函数和普通成员函数

C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是共享的。而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是自己独有的。 #include&lt;iostream&gt; class Person { public: void ordinaryfunc();//声明一个普通成员函数 void sta...

Myliang97的博客 1万+

脑影像分析软件推荐 | JuSpace

JuSpace是一种允许基于 MRI 测量与核成像衍生估计的跨模态关联的工具包,它涵盖各种神经递质系统,包括多巴胺能、血清素能、去甲肾上腺素能和 GABA(γ-氨基丁酸) 神经传递。JuSpace 由一组 Matlab 功能以及涵盖各种受体系统的 PET 受体图谱组成。

NHKJ_ZF的博客 1707

c++~第4课-----特殊成员

const成员 const数据成员 const类型变量是不可以修改,只读模式 必须采用初始化参数列表方式初始化 const成员函数 写法上,const写在函数后面 常成员函数是不能够修改数据成员,只读数据成员 常成员函数可以和普通函数同时存在 普通对象和常成员函数同时存在,普通对象优先调用普通函数 普通对象可以调用常成员函数 //同时存在 class MM { void print() { //num = 0;//错误,不能修改只读模式 cout <<"普通函数"

小杨的博客 323

可视化大屏系列(5):设备状态面板与数据分析仪表盘

在这篇文章中,我们将重点讨论如何通过智能化手段提升工地设备的管理效率与维护质量。随着智能工地系统的不断发展,设备监控与维护管理变得尤为重要。本篇将从 设备状态实时监控、自动化维护提醒、设备管理与维修记录 三个方面入手,展示如何通过 Vue3 和 ECharts 构建一个智能化的设备管理平台,实时采集和展示设备运行状态、及时生成维护提醒并记录维修历史,以提高设备的使用效率与安全性。我们还将结合实际代码示例,详细讲解如何实现这些功能,帮助你在智能工地项目中实现设备管理的智能化、数字化和自动化。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 3365

超分算法 SwinIR: Image Restoration Using Swin Transformer

这篇文章结构比较简单,如果看过Swin-Transformer的话就没什么难点了。作者引入Swin-T结构应用于低级视觉任务,包括图像超分辨率重建、图像去噪、图像压缩伪影去除。网络由一个浅层特征提取模块、深层特征提取模块、重建模块构成。重建模块对不同的任务使用不同的结构。浅层特征提取就是一个3×3的卷积层。深层特征提取是k个RSTB块和一个卷积层构成。RSTB(Res- SwinIR: Image Restoration Using Swin Transformer[ICCV 2021]Abstract1.

qq_45122568的博客 1万+

C++中的特殊成员

1. const成员 1.1 const数据成员 const类型变量是不可修改的只读模式,必须采用初始化参数列表方式进行初始化 1.2 const成员函数 写法:const写在函数后面 常成员函数不能修改数据成员,只可读取 常成员函数可以和普通函数同时存在 当常成员函数和普通函数同时存在时,普通对象优先调用普通函数 1.3 const对象...

小狐狸的博客 1063

【WSN定位】基于AOA算法实现目标无源定位附matlab代码

1 简介 2 部分代码 clear all; close all; clc;​stations = [0 0 0;20 0 0]; %基站位置​X = -100:100; %生成目标位置Y = X.*sin(X);Z = X+Y;N = length(X);Locations = zeros(N,3);angs = zeros(N,4);for i = 1:N angs(i,:) = Angs(stations*1e3,[X(i),Y(i),Z(i)]*1e3);end​for

qq_59747472的博客 2308

第05节 C++特殊成员

const成员 const数据成员 const类型变量是不可以修改,只读模式 #include <iostream> #include <string> using namespace std; class MM { public: void print() { //不能修改 //num = 1001; 错误,只读模式 cout << name << " " << num << endl; } protec

qq_24409999的博客 299

在anaconda环境中使用conda命令安装cuda、cudnn、tensorflow(-gpu)、pytorch

文章目录在anaconda环境中使用conda命令安装cuda、cudnn、tensorflow(-gpu)、pytorch结论参考资料解释相关命令版本关系版本选择总结:实验 在anaconda环境中使用conda命令安装cuda、cudnn、tensorflow(-gpu)、pytorch 结论 使用conda虚拟环境 使用conda命令安装 最重要的是版本关系(python、cuda、cudnn、pytor或者tensorflow框架)的对应。 参考资料 tensorflow2.x安装 理清GPU、

纸上得来终觉浅,绝知此事要躬行! 3万+

在Keil uv5里面添加STC元器件库,不影响其他元件

先到网上下载stc.CBD(宏晶网站的地址实效了)还有STC新系列单片机的头文件,宏晶的网站就有1、在Keil/C51/INC下新建目录"STC"文件夹, 把所有STC新系列单片机的头文件拷贝到"STC"目录下。2、下载的用于keil下的STC器件数据库更名为STC.CDB并拷贝到Keil/UV4目录下。3、打开Keil文件夹下的TOOLS.ini文件。4、在[UV2]下键入CDB0="UV2\S

技术联盟 1万+

C++ 入门07:静态成员和常量成员

在前面文章的学习中,我们掌握了类和对象的基础知识以及构造函数的重载与拷贝构造函数。今天,我们将学习类的静态成员和常量成员。静态成员和常量成员是面向对象编程中重要的概念,了解它们有助于我们编写更高效和更安全的代码。

LF__plus的博客 1848

2022年12月机器人技术等级考试试卷(三级实操) 试题解析

2022年12月机器人技术等级考试试卷(三级实操) 试题解析

http://www.cierobot.com 1522

【C++进阶学习】第十四弹——特殊类设计——探寻各种情况下类的应用

【C++进阶学习】第十四弹——特殊类的设计:探索特殊条件下类的设计方式,加深对类的理解和应用

2301_80220607的博客 3974

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++复习day05

类和对象

2301_79420799的博客 5649

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【C++】 特殊类设计:从构思到实现,引领设计新潮流

详细介绍了c++特殊类的设计和实现细节

You build it, you run it 2115

【C++】特殊类设计&类型转换

本篇文章的内容是C++的拓展学习,主要介绍在某些特定场合下的一些特殊类的设计,并且总结了C/C++中的类型转换。1、内置类型转换为自定义类型 -> 通过构造函数实现。2、自定义类型转换为内置类型 -> 通过operator 类型实现。class Apublic:A(int a):_a1(a),_a2(a){}:_a1(a1), _a2(a2){}// ()被仿函数占用了,不能用// operator 类型实现,无返回类型private:int main()

2301_77900444的博客 1503

[C++学习笔记05]对象的使用

static成员  普通static成员    必须在类体外定义。  特殊static const成员    整型(int,char,short,long等)static const成员      可以不需要在类体外定义,如果没有在类外部初始化,必须在类体内初始化(常量)。    非整型static const成员      非整型不能像整型那样,不允许在类体初始化,只能在类外定义初...

aqgapja0504的博客 186

Day_05 特殊成员(const 、static)与友元

1.const (1).const成员数据 const修饰词,可以修饰成员数据,也可以修饰成员函数。修饰成员数据时,表示成员数据不能更改。且成员函数只能通过初始化列表来赋值(或者在定义数据成员时就给它赋初始值)。 class MM{ public: MM(){string name,int age}:name(name),age(age){ } void print(){ //age=22; 错误 一旦通过初始化参数...

qq_29941503的博客 350

成员函数指针的用法

一、成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数。比如:

u013500944的专栏 1865

第18 章探讨 C++新标准.新的类功能.特殊的成员函数,默认的方法和禁用的方法

第18 章探讨 C++新标准.新的类功能.特殊的成员函数,默认的方法和禁用的方法。

zhyjhacker的博客 588

C++ 类的6个默认成员函数

构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。析构函数通常与构造函数相对应,是在对象被销毁时自动调用的特殊成员函数。它的作用是释放对象占用的资源,比如动态分配的内存或打开的文件等。拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,其内容与现有对象完全相同。它用于解决如果类中有动态分配的资源(如堆内存、文件等),拷贝构造函数可以确保新对象得到正确的资源副本,

BuiderCodes的博客 1196

C++学习05

一、类中的隐藏问题,二、类中的多继承,三、多级继承,四、多继承的特殊形式--菱形继承,五、虚函数,六、多态: 什么是多态???

asd78999的博客 824

c++六个默认成员函数(上)

c++的六个默认成员函数

You build it, you run it 1702

【C++】学习笔记——特殊类的设计

由于饿汉模式在程序进入主函数前就需要把对象创建出来,如果单例模式太多,或者这个对象太大,则会拖慢程序的启动,对性能要求较高。C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。我们需要判断是否是第一次使用实例,如果是第一次使用实例才创建对象,否则返回原本就存在的对象。

m0_69828905的博客 758

【精读《Effective C++》】构造/析构/赋值运算(上)(条款05-08)

读完《Effective C++》第二章前四条,我把 C++ 对象从生到死、再到赋值的关键规则串成一条线。条款05讲编译器偷偷写了哪六个函数;条款06讲怎么拒绝拷贝;条款07解释为什么多态基类必须 virtual 析构、不该 virtual 的类加上 virtual 反而亏;条款08说明析构函数吞异常的两种姿势以及把 close 暴露给客户的更佳设计。最有冲击的是 vptr 带来的 50%~100% 体积膨胀——一个"小决定"的代价原来这么具体。

2603_96808033的博客 754
上一篇: C++构造函数析构函数 拷贝04
下一篇: Markdown编辑器 使用
燕子01
博客等级 码龄6年 8粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值