C++ 类和对象(上)

类和对象cpp 【类的成员函数和类的定义分开写】(截到人脸郭老师orz【注意这里的::表示不是全局函数,而是一个类的成员函数】 阅读详情

一、面向过程 VS 面向对象

1. 面向过程

面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。

在这里插入图片描述

2. 面向对象

在日常生活或编程中,简单的问题可以用面向过程的思路来解决,直接有效,但是当问题的规模变得更大时,解决问题的步骤不确定时,用面向过程的思想是远远不够的,所以慢慢就出现了面向对象的编程思想。世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。

在这里插入图片描述

二、类的概念

在C语言部分学习了结构体,结构体可以把姓名、学号、身高和体重等结构变量放到一起,定义结构体类型,以下面的结构体为例:

struct Student
{
	char name[20];
	char id[11];
	int weight;
	int height;
};

int main()
{
	struct Student stu1 = { "zhangsan", "2202101001", 60, 180 };
}

在C++中,结构体不叫结构体,而叫“类”;在C语言中定义的结构体变量,在C++中称为“对象”。类比结构体更强大的地方在于:类体内不仅可以定义成员变量,还可以定义成员函数(方法)。

比如用C语言方式实现的栈,结构体中只能定义 top、capacity、a 这些变量,而入栈、出栈、初始化这些函数只能在结构体外部定义;而使用C++我们就可以直接将这些函数定义在结构体内部:

//成员函数与成员变量都定义在结构体中
struct Stack
{
	//成员函数(方法)
	//初始化
	void Init(int N = 4)  //缺省参数 -- 初始化空间大小
	{
		_data = (int*)malloc(sizeof(int) * N);
		if (_data == nullptr)
		{
			perror("malloc fail\n");
			exit(-1);
		}
		_top = 0;
		_capacity = N;
	}

	//入栈
	void Push(int x)
	{
		if (_top == _capacity)
		{
			int* tmp = (int*)realloc(_data, sizeof(int) * _capacity * 2);
			if (tmp == nullptr)
			{
				perror("realloc fail\n");
				exit(-1);
			}
			_data = tmp;
			_capacity *= 2;
		}
		_data[_top++] = x;
	}

	//取栈顶的数据
	int Top()
	{
		return _data[_top - 1];
	}

	//销毁栈
	void Destroy()
	{
		free(_data);
		_data = NULL;
	}

	//成员变量(属性)
	int* _data;
	int _top;
	int _capacity;
};

int main()
{
    struct Stack s1;   //定义一个属于该类的变量(对象)
    s1.Init();         //通过对象调用成员函数
    s1.Push(1);        
    S1.Destroy();
    return 0;
}

注意事项

C++类可以直接使用结构体名称代表类名,省略 struct 关键字。比如Stack s1;

不管C语言还是C++中,结构都用 struct 定义;在C++中定义类更喜欢用 class 代替 struct,但是大体上它们极其类似。

三、类的定义

class ClassName
{
  //......  类的成员:成员变量和成员函数
};

1. 成员函数的定义方式

  1. 函数声明和定义全部放在类体中,这样编译器可能会将函数当成内联函数处理

在这里插入图片描述

  1. 函数声明和定义分离

在这里插入图片描述

函数声明放在类体里,位于头文件中,函数定义放在 .cpp 文件中。由于类定义了一个新的作用域,类的所有成员都在类的作用域中,所以在类体外定义成员时,需要使用作用域限定符::指明成员属于哪个类域。

注意事项

类域和命名空间域不同,命名空间域中存放的是变量和函数的定义,而类域中虽然可以定义函数,但只能声明变量,并没有为变量开辟空间,只有用这个类实例化出对象才会开辟空间;这也就是为什么结构体和类中的成员变量都不能直接初始化,而是必须先定义出变量的原因。

2. 成员变量的命名潜规则

由于成员函数可以访问成员变量,也可以接收函数参数,所以这两者命名很可能会发生冲突,比如:

class Date
{
	void Init(int year, int month, int day)
	{
		year = year;   //这谁知道谁是谁啊?
		month = month; 
		day = day;
	}
    
	int year;
	int month;
	int day;
};

为了解决这种赋值时的不确定性,在C++中有一个潜规则:成员变量使用某种修饰符来修饰,其中常见的有四种:_menber、menber_ 、m_menber、mMenber,我选择的是第一种,但不管你选的哪种,尽量选定之后就长期保持这种风格。

3. 类的版式

在这里插入图片描述

为什么第二种版式中成员函数依旧可以访问成员变量:C语言编译器寻找变量的规则是先到局部域去找,然后再到全局域去找,所以C语言中规定变量必须定义在函数前面,才可以在函数中使用该变量;但是C++编译器不一样,C++编译器会把类看作一个整体,当我们在成员函数中使用一个变量时,它会先到整个类中去寻找,然后再到全局域去寻找;所以在C++中,我们是可以将成员变量定义到成员函数后面的;

四、封装

访问限定符

在结构和类中,有三个重要的权限修饰符,分别是 public(公有)、 private(私有)、 protected(保护),这里只介绍公有和私有。

  1. public:用这个修饰符修饰的成员,可以被外界访问。被public修饰的成员就像是类的外部接口一样。
  2. private:用这个修饰符修饰的成员,只能被类内部定义的成员函数使用。

class 定义的类所有成员默认访问权限为 private,struct 默认为 public ( 因为struct要兼容C );一般情况下,类的成员变量用private修饰,成员函数用public修饰,作为对外接口。

在这里插入图片描述

封装

封装的定义:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些内部元件。

由于C语言没有访问限定符,也没有封装的概念,所以用户可以轻易访问数据、更改数据,这样很不安全,操作对用户也不友好。但是C++就不会出现这种情况,因为C++类成员变量通常都会用 private 修饰,用户不能直接访问类中的数据,只能通过特定的接口 (用 public 修饰的函数) 来操作对象,这样既保证了安全性,又减低了操作难度。

五、类的实例化

用类类型创建对象的过程,称为类的实例化。

类就像是建筑设计图,只设计出需要什么东西,但是并没有实体的建筑存在,定义出一个类并没有分配实际的内存空间;类实例化出对象就像现实中使用建筑设计图建造出房子,实例化出的对象才会占用物理空间,存储成员变量。

在这里插入图片描述

在这里插入图片描述

六、类对象存储方式

在C语言阶段我们学习了如何计算一个结构体类型的大小,那么对于与结构体类似的类来说,怎么计算类的大小?

要想计算类的大小,必须知道类对象的存储方式,早期关于类对象的存储方式一共有三种设计方式;

方式一:对象中存储类的所有成员,包括成员变量和成员函数

在这里插入图片描述

成员函数经过编译后变成一段指令,这段指令存储在一个公共区域:常量区 (代码段) ,我们把这段指令中第一条指令的地址作为函数的地址,存储在类对象中,所以同一个类实例化出的不同对象存储的是同一个地址,调用的也是同一份指令。但是同一个类的不同对象不能共用同一个成员变量,因为每一个对象的成员变量的值都是不同的;

缺点:当一个类创建多个对象时,每个对象中都会保存一份函数的地址,相同的地址保存多次,浪费空间。

方式二:对象中存储成员变量和一份存放代码的区域的首地址

在这里插入图片描述

也就是说,我们不单独保存每一个函数的地址,而是保存类中所有函数所在的代码段的起始地址,我们通过这个地址就可以找到各个函数

方式三:对象中只存储成员变量

在这里插入图片描述

经过对比,方式二似乎才是最高效可用的,因为方式三连成员函数的地址都没存储,怎么调用成员函数?而实际上方式三是可行的,因为函数经过编译后形成的指令是由编译器放置到代码段中去的,所以编译器在调用该函数时也能轻松的找到指令在公共代码段中所处的位置。

基于上面这个原理,方式二存储代码段的地址也显得多余了,所以最终我们选用方式三来存储类对象,这样计算一个类的大小就没有难度了,和结构体的计算方式一模一样。

在这里插入图片描述

空类的大小

在面试时经常会考察空类的大小,也就是没有成员变量的类,它的结果和我们的常识并不相符,因为空结构体的大小为0,按理说空类的大小应该也是0,但其实不是的:

在这里插入图片描述

实际上,这是类实例化的原因,C++规定:任何不同的对象不能拥有相同的内存地址。 如果空类大小为0,若我们声明一个这个类的对象数组,那么数组中的每个对象都拥有了相同的地址,这显然是违背标准的。所以,为了保证每个对象在内存中都有一个独一无二的地址,编译器往往会给一个空类隐含地加一个字节,这样空类在实例化后在内存中就得到了独一无二的地址,所以空类所占的内存大小是1个字节。

七、this指针

以下面这个日期类来引出this指针:

class Date
{
public:
	void Init(int year = 2003, int month = 10, int day = 19)
	{
		_year = year;
		_month = month;
		_day = day;
	}

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

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Init(2023, 9,9);
	d1.Print();

	Date d2;
	d2.Init(2023,9,9);
	d2.Print();

	return 0;
}

对于上述类,很多人都有这样一个问题:虽然Date类中的成员函数是由具体的对象调用的,但是并没有传入对象的值或者地址,在函数体内函数是怎么知道那些成员变量是存储在哪个对象的?

实际上,C++是隐藏地传了对象的地址的,也就是this指针。C++编译器给每个 “非静态的成员函数“ 增加了一个隐藏的指针参数作为第一个参数,让该指针指向当前对象 (函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问;只不过所有的操作对用户是透明的,即用户不需要来传递 this 指针,编译器会自动完成。

在这里插入图片描述

上面的代码经过编译器处理后会变成下面这样:

class Date
{
public:
	void Init(Date* const this, int year = 1970, int month = 1, int day = 1)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}

	void Print(Date* const this)
	{
		cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Init(&d1, 2022, 10, 3);
	d1.Print(&d1);

	Date d2;
	d2.Init(&d2, 2022, 10, 4);
	d2.Print(&d2);

	return 0;
}

this 指针参数是由编译器自动传递的,当用户主动传递时编译器会报错,但是我们可以在成员函数内部显示地去使用 this 指针。

image-20221003231025875

注意事项

  1. this 指针只能在 “成员函数” 的内部使用;
  2. this 指针使用 const 修饰,且 const 位于 * 的后面,表示 this 指针的指向不能被修改,但可以修改其指向的对象。
  3. this 指针是“成员函数”第一个隐含的形参,一般情况下由编译器在建立“成员函数”的函数栈帧时压栈传递,不能由用户主动传递。(注:由于this指针在成员函数中需要被频繁调用,所以VS对其进行了优化,将this指针存储在 ecx 寄存器内,可以加快访问速度)
  4. this 指针作为参数传递时是可以为空的,但是如果成员函数中使用到了 this 指针,那么就会造成对空指针的解引用;
//下面两段程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行

class A             //程序1
{
public:
    void Print()
	{
		cout << "Print()" << endl;
	}
private:
	int _a;
};

int main()
{
	A* p = nullptr; 
	p->PrintA();     //传递空指针
	return 0;
}
//***********************************//

class A              //程序2
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	int _a;
};

int main()
{
	A* p = nullptr;
	p->Print();       //同样传递空指针
	return 0;
}

结果是程序1正常运行,程序2运行崩溃。

在程序1中虽然我们用空指针 p 访问了成员函数Print,但是由于成员函数并不存在于对象中,而是存在于代码段中,所以编译器只是把指针p传给了成员函数,并不会对 p 进行解引用;

而程序 2 在把指针 p 传给了成员函数后,对指针 p 进行了解引用来访问成员变量 _a,出现了对空指针进行解引用。

八、用类实现栈

typedef int DataType;
class Stack
{
public:
	void Init(int N = 4)
	{
		_array = (DataType*)malloc(sizeof(DataType) * N);
		if (NULL == _array)
		{
			perror("malloc fail\n");
			exit(-1);
		}
		_capacity = N;
		_top = 0;
	}

	void Push(DataType data)
	{
		CheckCapacity();
		_array[_top] = data;
		_top++;
	}

	void Pop()
	{
		if (Empty())
			return;
		_top--;
	}

	DataType Top()
	{
		return _array[_top - 1];
	}

	int Empty()
	{
		return 0 == _top;
	}

	int Size()
	{
		return _top;
	}

	void Destroy()
	{
		if (_array)
		{
			free(_array);
			_array = NULL;
			_capacity = 0;
			_top = 0;
		}
	}

	void CheckCapacity()
	{
		if (_top == _capacity)
		{
			int newcapacity = _capacity * 2;
			DataType* temp = (DataType*)realloc(_array, newcapacity            *sizeof(DataType));
			if (temp == NULL)
			{
				perror("realloc fail\n");
				exit(-1);
			}
			_array = temp;
			_capacity = newcapacity;
		}
	}

private:
	DataType* _array;
	int _capacity;
	int _top;
};

int main()
{
	Stack S1;
	S1.Init();
	S1.Push(1);
	S1.Push(2);
	S1.Push(3);
	S1.Push(4);
	S1.Push(5);
	S1.Push(6);
	int n = 6;
	while (n--)
	{
		cout << S1.Top() << endl;
		S1.Pop();
	}
	S1.Destroy();
	return 0;
}

在用C语言实现时,每个函数的第一个参数都是Stack*,而且在函数中必须要对指针进行检测,因为指针可能会是NULL;在C++中,每个方法都不需要传递 Stack * 的参数了,因为编译器会自动传入对象的地址。

相比C语言而言,C++中通过类可以将数据以及操作数据的方法进行完美结合,通过访问权限修饰可以控制哪些方法在类外可以被调用,即封装,在使用时只需以对象为中心,通过对象的方法和其他对象进行交互,更符合人类对一件事物的认知。

C++中的“类和对象” 类的定义,实例化,this指针 阅读详情

相关推荐

WSL2 Ubuntu 22.04安装NVIDIA驱动避坑指南:从驱动版本选择到CUDA环境验证

本文详细介绍了在WSL2 Ubuntu 22.04中安装NVIDIA驱动和配置CUDA环境的完整流程,包括驱动版本选择、环境变量设置以及常见问题解决方案。通过本指南,用户可以避免常见的安装陷阱,确保GPU加速环境正确配置,适用于深度学习开发和CUDA编程。

weixin_28419039的博客 463

【c++】cpp类和对象

c++中类和对象基本用法

hutaotaotao的博客 1268

WIN下使用visual studio 2022安装GMSSL命令行工具

2.1 使用管理员权限打开visual studio(非常重要,否则最后一步 nmake install会失败)右键vs2022,以管理员身份运行即可。2.4 配置环境变量,gmssl可执行程序默认会被安装到如下目录。将如下路径添加到系统环境变量即可。添加后的环境变量如下。2.编译解压后的gmssl源码,编译过程主要参考install.md中的内容,README.md中的步骤不完整。2.2 打开vs2022的命令终端,右键文件,选择在终端中打开。1.下载gmssl源码,解压到相应目录。

qq_45794382的博客 1269

Cpp-类和对象

title: 类和对象 date: 2019-03-15 14:05:24 tags: Cpp categories: Cpp 类的引入 万物皆对象。类是一种用户自定义的数据类型,包括表示属性的成员变量和表示行为的成员函数,类是现实世界对象的抽象,对象是类虚拟世界的实例。 C++ 中 struct 中不仅可以有变量,还可以有函数。 类定义结束时后面分号。 成员函数声明和定义可以全部...

ahojcn 的博客 1896

51雾化器实现

1. 雾化器简介 雾化器是将试液雾化的一种器械。雾化器是原子化系统的重要部件,其性能对测定的精密度和化学干扰等产生显著影响。因此要求雾化器喷雾稳定、雾滴细小、均匀和雾化效率高。雾化器的类型有超声雾化器,空气压缩式雾化器,网式雾化器。超声雾化器因其价格合适,适合家用,被广泛应用于加湿器,香薰机等各种小家电,也在医疗领域有很多的应用。家用雾化器的主要器件是一枚雾化片。 家用雾化器分为两种不同类别雾化片,实孔雾化片和微孔雾化片,这两种的喷雾方法和工作原理是有所不同的。不同的雾化片需要特定的频率才能工作。 实孔雾

qq_42415953的博客 2万+

基于rms包的限制性立方样条回归(RCS)R代码实现

RCS

2301_79584199的博客 2万+

CPP:类和对象

cpp类和对象知识点

weixin_54832720的博客 969

osg3.6.5---osgEarth3.2 实现数字地球的加载

目前我在网上找得比较多的是osgearth2.10及以下的版本及加载数字地球的方法,但是我使用的是osg3.6.5和osgEarth3.。但是3.x版本和2.x版本差别很大,主要区别在于2.x有7个主要库,而3.x版本只有osgEarth这一个库。所以,特别记录一下。后面我讲他集成到qt的窗体在上传更新新的代码。1.直接上源码pro文件和cpp文件。

枫影竹韵的博客 1001

cpp.1 C++类和对象(上)

文章目录第一部分 C++入门1.命名空间2.缺省参数3.函数重载4.引用 第一部分 C++入门 1.命名空间 命名空间实际上就是为了防止命名相同会导致很多的冲突,可以使用命名空间对标识符进行本地化,来避免命名的冲突 使用方式: 1.加命名空间名称及作用域限定符std::cout<<"hello world"<<std::endl; 2.使用using将命名空间中成员引入using std::cout; 3.用using namespace 命名空间名称引入using namespac

Pinksatrfish的博客 368

Altium Designer(AD)PCB拼版——两种方法教程

本文详细介绍了PCB拼版的设计要点与操作方法。主要内容包括:拼版目的(解决小尺寸夹持问题、提高利用率、降低成本)和三大连接方式(V-CUT、邮票孔、空心连接条)的特点与参数设置;工艺边设计规范(宽度、定位孔、Mark点等要求);拼版尺寸限制与常见错误检查;以及两种具体拼版操作方法(特殊粘贴和拼版阵列),并附有工艺边、定位孔、Mark点的绘制步骤示意图。同时提供了硬件工程师笔试面试相关资源链接。全文系统阐述了PCB拼版的核心技术和操作流程,为电子设计人员提供了实用指导。

XU157303764的博客 7592

X书关键词协议搜索

【代码】X书关键词协议搜索。

Codeooo 博客 6377

【Cpp】类和对象

类的认识,类和对象(一)

石墨博客 1174

【YOLOv11】006、YOLOv11数据增强策略:Mosaic、MixUp等增强技术原理解析

摘要:YOLOv11在产线缺陷检测中遇到小尺寸瑕疵漏检问题,暴露了训练数据过于"干净"的缺陷。数据增强的核心是提升模型泛化能力,而非简单扩充数据。Mosaic增强通过多图拼接迫使模型处理多尺度目标,需注意边界框裁剪细节;MixUp通过线性插值使决策边界更平滑,但需避免类别冲突。自适应增强策略应随训练进度动态调整强度。实际应用中,需针对小目标、类别不平衡等场景调整增强参数,并确保验证与推理流程一致。数据增强应针对性解决具体问题,而非盲目尝试组合。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 365

【C++】类和对象

类的基本思想是数据抽象(data abstraction)和封装(encapsulation)。数据抽象是一种依赖于接口(interface)和实现(implementatino)分离的编程技术。对象是类的实例,类是对象的模板。

jmlangel_的博客 5955

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【C++】类和对象核心总结

类的引入+定义(struct ==> class),类的访问限定符+封装+作用域,类的实例化(类 类型创建对象的过程)+计算类的大小(考虑内存对齐),隐藏的this指针,类的六个默认成员函数,初始化列表(声明远远不够,还得定义对象),explict关键字,static成员,友元,内部类,匿名对象,编译器优化

小羊study_sheep的博客 5593

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C++指南】一文总结C++类和对象【下】

本章节主要讲初始化列表、类型转换、静态成员变量和函数、友元、内部类、匿名对象及编译器优化的各种情况。

egoist2023的博客 3493

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c++学习 类和对象上

【代码】c++学习 类和对象上。

qq_50934329的博客 198

【C++】类和对象——下

尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其。友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。

L286594的博客 1361

C++实验四——类和对象(2)

实验报告题目1题目2 【实验名称】 实验四 类和对象(2) 【实验内容】 题目1 课本习题4.10 设计一个用于人事管理的“人员”类。由于考虑到通用性,这里只抽象出所有类型人员都具有的属性:编号、性别、出生日期、身份证号等。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录人和显示。要求包括:构造函数和析构函数、复制构造函数、内联成员函数、带默认形参值的成员函数、类的组合。 源代码: Date.h /*出生日期类声明*/ #ifndef _Date_H_ #

Onlyone_1314的博客 2336

【C++】类和对象(1)

C++类和对象,内存对齐,this指针,

Xie_sheng的博客 1791

【C++】类和对象【上】

本期博客带你了解C++中类和对象相关知识。

2401_86785052的博客 1042

CPP_类和对象

*默认构造函数(无参构造函数,全缺省构造函数,没有构造函数时编译器默认生成的构造函数)**最多只能有一个,也可以没有(如果没有,那就不能用默认方式初始化)如果当自己写了别的不是默认构造函数形式的构造函数,那就需要自己在写一个默认构造函数。某一个类的时候,才会为类里面的成员变量开辟空间(即它的定义)(也就相当于类其实是一种设计,并没有实际的东西,只有实例化之后,才有这种设计对应的实例)其实对于实例化对象来说,虽然成员函数是共用的,但每个实例调用时都是使用自己的成员变量的值,

2401_86941858的博客 622

cpp中的类和对象

类和对象的区别: 类(class):概念产物,是设计产物(相对于图纸),没有开辟空间 对象(object):是由类实例化出来的代码和数据的集合 类的实例化就成为了对象 我们操纵的是对象,不是类 封装特性:对外是不可访问的 this指针 编译过程: 第一步:识别类里面的属性成员(变量) 第二步:识别方法,只识别方法的声明 第三步:改写 ...

qq_44423388的博客 951

C++ —— 类和对象

类是对象一种抽象的描述,是定义同一类所有对象的变量和方法的蓝图或模型,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它,因为这些成员变量只是声明,只有在实例化出对象的时候,才会分配空间。所以,用类类型在物理内存中创建对象的过程,就是类实例化出对象。(一个类可以实例化出多个对象,实例化出的对象,会占用实际的物理空间,用来存储类成员变量 )类和对象的关系是类是对象的抽象,而对象是类的具体实例。‌C语言中,我们定义一个结构体是用的struct//定义一个日期类型int year;

2301_80873544的博客 1534

C++类和对象

声明和定义放到类体中public:public:char*_name;char*_sex;int _age;声明放.h文件中,类的定义放.cpp文件中。

mzk_c的博客 1822
上一篇: C++引用
下一篇: C++ 类和对象(中)
岸边露伴'
博客等级 码龄3年 2粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值