C++类和对象(最终篇)

༺ 个人主页 · 纪念229 ༻

🏠我的博客主页🏠

༒专栏目录:《数据结构》༒

༒专栏目录:《算法》༒

༒专栏目录:《C++》༒

༒专栏目录:《MySQL数据库》༒

༒专栏目录:《前端开发》༒

༒其它有趣的计算机知识༒

༺世上本没有路,走的人多了自然就有了༻


本篇文章讲的是C++类和对象最后一节,主要类与对象的代码讲解,希望对你有所帮助


文章目录


1.类和对象代码讲解

这个代码上次没讲完整,这次补充

c 复制代码
//class Sum
//{
//public:
//	Sum()
//	{
//		_ret += _i;
//		++_i;
//	}
//	
//	//静态成员函数(属于类不属于对象)
//	//只可以调用静态成员变量
//	//静态成员函数没有this指针
//	//静态成员函数不经过对象也能调用
//	// a.GetRet();(可以不推荐)
//	// A::GetRet();(推荐调用方法)
//	
//	static int GetRet()
//	{
//		return _ret;
//	}
//	//static在不同位置上的含义
//	//局部变量 延长到全局函数结束结束
//	//全局变量/函数 只可在本文件可见(隐藏)
//	//类成员 不属于对象,无this
//
//
//private:
//	static int _i;
//	static int _ret;
//	//静态成员变量
//	//也可以被成员函数调用
//	
//};
//
//int Sum::_i = 1;
//int Sum::_ret = 0;
////静态成员变量属于类要在外面初始化
//
//
////所以这里我们要区分好类函数成员函数
////类变量成员变量
//
////但是类函数要放在类里声明(定义)

在成员函数前加一个static就是静态成员函数

静态成员函数没有this指针

静态成员函数不属于对象属于类调用时不用对象方便

只可以调用静态成员变量(但是成员函数可以调用成员变量和静态成员变量)

静态成员变量不属于类在构造函数调用后不会消失(可用于等差数列等)

静态成员变量(初始化要在类外面)

static在不同位置上的含义

局部变量 寿命延长至全局函数结束

全局变量/函数 只有本文件可见(隐藏)

类成员不属于对象,无this


c 复制代码
//class Solution
//{
//	int Sum_Solution(int n) {
//		//Sum arr[n];
//		//c语言有些编译器支持变长数组有些要加一些配置支持
//		//c++不支持变长数组有迭代器vector变长数组在std域内
//		//头文件#include<vector>
//		vector<Sum> arr(n);
//		//这里是类数组的实例化实际上是数组内每个类都会调用构造函数
//		
//
//		return Sum::GetRet();
//	}
//
//};

//class Sum
//{
//public:
//	Sum()
//	{
//		_ret += _i;
//		++_i;
//	}
//
//	static int GetRet()
//	{
//		return _ret;
//	}
//private:
//	static int _i;
//	static int _ret;
//};
//
//
//int Sum::_i = 1;
//int Sum::_ret = 0;

这里就是静态成员函数/变量的具体代码用法(等差数列)

想法就是利用构造函数调用实现求n项和

在成员函数里写个类数组将它实例化,它的每个元素(类)都会

进行实例化调用构造函数因为调用的是静态成员变量生命周期长可以实现等差数列求n项和

但是c++不支持变长数组所以我们需要有关变长数组的迭代器(vector)

(且这个东西在std域内)

头文件#include

vector<Sum> arr(n);

写了这个东西迭代器会自动调用每个类元素的构造函数

(n)里的n说明做个变长数组有多少元素用的不是n是(n)

c 复制代码
//class Solution
//{
//	public:
//		int Sum_Solution(int n)
//		{
//			//讲的还是类数组
//			Sum* arr = new Sum[n];
//		//new不需要头文件
//	    //new的作用是在堆上申请一块空间(此域销毁了空间还在堆中需要手动销毁)
//		//如果有类类型会调用构造函数(类对象和类数组都会调用构造函数有了new)
//		//new最后返回指针变量
//			return Sum::GetRet();
//		}
//};

这里还有一个使用类数组的方式(接收的是它的指针变量)

Sum* arr = new Sumn;

用一个new 类名n就构造了一个类数组但是返回的是地址

new不需要头文件

new的作用是在堆上申请一块空间最后要将这个空间销毁

c 复制代码
//class Solution {
//	//类里面可以嵌套一个类
//public:
//	//类定义不写访问限定符为private外面用不了嵌套的类
//	//改为public即可
//	class Sum {//Sum是Solution的嵌套
//	public:
//		Sum()
//		{
//			_ret += _i;
//			++_i;
//		}
//	};
//public:
//	//Sum_Solution函数是Solution的成员函数
//	int Sum_Solution(int n)
//	{
//		//写个指针变量存类数组
//		Sum* arr = new Sum[n];
//		//Sum* arr = new Sum(n);
//		//这里不是new Sum(n);
//		//是new Sum[n];
//		return _ret;
//	}
//private:
//	static int _i;
//	static int _ret;
//};
//
//int Solution::_i = 1;
//int Solution::_ret = 0;
////调试时Solution里看不到成员变量
////因为该类没有成员变量,那两个是静态成员变量
////不在对象里属于类
////调试时直接写变量名看不到,要写类限定名
////加变量名才可看见(它属于类不属于类的对象)
//int main()
//{
//	Solution s;
//	Solution::Sum a[3];
//	//通过类限定名调用嵌套的类 将其对象实例化
//	cout << s.Sum_Solution(10) << endl;
//	return 0;
//}

这里之前没在嵌套类前写访问限定符public外面的用不了用了即可调用

调用要加类限定名

调式时看不到成员变量原因是只有静态成员变量不属于对象属于类

要在调试看到要加类限定名 与 静态成员变量名

调用嵌套类直接在前面加类限定名即可


c 复制代码
//class A
//{
//	friend class B;
//	//友元函数和友元类都在类中但都是外面普通
//	//的函数和类只是可以调用该对象的成员变量
//
//	//对象里有成员变量后非静态成员函数
//	//成员函数可以被多个对象调用
//
//
//
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//
//class B
//{
//public:
//	void func1(const A& aa)
//	{
//		cout << aa._a1 << endl;
//		cout << _b1 << endl;
//	}
//
//	void func2(const A& aa)
//	{
//		cout << aa._a2 << endl;
//		cout << _b2 << endl;
//	}
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};

友元类和函数在类中但都是外面的普通类和函数但是可以调用对象的成员变量

对象里有成员变量和非静态成员函数

成员函数可以被多个对象调用


c 复制代码
//刘备 客卿
class A
{
private:
	//静态成员函数要单独在外初始化(调用要加限定名)
	static int _k;
	int _h = 1;
public:
	class B //B默认就是A的嵌套
	{ 
	public:
		void foo(const A& a)
		{
			cout << _k << endl;
			cout << a._h << endl;
		}
	private:
		int _b1 = 1;
		int _b2 = 1;
	};
};

int A::_k = 1;






int main()
{
	cout << sizeof(A) << endl;
	//这里看的是类的字节数,类的字节数
	//只与对象的成员变量有关
	//_k是静态成员变量不属于对象不计入字节
	A aa1;
	A::B bb1;
	return 0;
}

类的字节数只与对象的成员变量有关(遵从对齐原则)

与静态成员变量无关

2.类和对象错题讲解

主要是讲类与对象我做错的题

A.不一定,因为inline只是一种建议,需要看此函数是否能够成为内联函数

B.inline函数的定义和声明必须在一起

C.inline函数可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数

D.递归用inline函数编译器会忽略

这里我们要知道long在Windows 都是4字节

shor 2字节

在64位指针位8字节 32位 4字节

因为是64位且最大默认对齐数是8字节

所以会补成24字节(对齐规则我C语言文章里有)

this指针在非静态成员函数里


文章到这就到一段落,希望对你有所帮助,感谢观看!

相关推荐
WJ.Polar12 小时前
Java封装、继承、多态
java·开发语言
摇滚侠12 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
weixin_3077791312 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
AI wins13 小时前
c++新增頭文件
c++
Shadow(⊙o⊙)13 小时前
仿muduo实现高并发服务器——事件就绪管理Channel.hpp
服务器·c++
爱读书的小胖13 小时前
Codewars:Rot13(C)解题分析
c语言·开发语言
鸽鸽程序猿13 小时前
【项目】【在线判题系统】b端题目增删改
开发语言·python
by2099913 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
Lhappy嘻嘻13 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
音草14 小时前
C++ 继承详解:从概念到菱形继承
c++