c++入门语法————初识类和对象

一、类的定义

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

在c语言中,仅支持的自定义类型为struct,且结构体成员仅为数据变量。
在c++在保留了,struct且拓展了class,结构体内不仅可以定义变量,也可以定义函数。
类的两种定义方式:

1. 声明和定义全部放在类体中

需注意:成员函数如果在类中定义,编译器可能会将其当成内
联函数处理。

class person {
public:
	void ShowInfo()
		{
		cout <<_name<<_sex<<_age << endl;
		}
public:
	char* _name;
	char* _sex;
	int   _age;
};

2.声明和定义分离

注意:成员函数名前需要加类名::
头文件:

class person {
public:
	void ShowInfo();
public:
	char* _name;
	char* _sex;
	int   _age;
};

源文件

void person::ShowInfo()
{
cout <<_name<<_sex<<_age << endl;
}

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

二、类的访问限定符及封装

在这里插入图片描述

【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  3. 如果后面没有访问限定符,作用域就到 } 即类结束。
  4. class的默认访问权限为private,struct为public(因为struct要兼容C)

三、类的实例化

类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设
计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

int main()
{
 Person._age = 100;   // 编译失败:error C2059: 语法错误:“.”
 return 0;
}

如上所示:erson类是没有空间的,只有Person类实例化出的对象才有具体的年龄。

在这里插入图片描述

四、 类对象的存储方式

按照类的形式应该将将成员函数的地址和成员变量都存在对象中
在这里插入图片描述
但是 存在问题:调的成员函数都是一样的,所以没必要都每个对象都存一个成员函数的地址。造成内存浪费。
所以在实践中为了节约空间将成员函数放在公共代码区,使用时直接调用,每个对象的成员函数地址都是相同的。‘
在这里插入图片描述

五.this指针

1.简单应用

在C++中,this指针是一个隐含的指向当前对象的指针,它是每个非静态成员函数的一个隐含参数。
通俗的说就是成员函数中的对象,会默认传入函数中,在一个类中可直接调用无需单独传参。
在这里插入图片描述
他有如下特点:

1.this指针是一个指向当前对象的指针,它指向调用该成员函数的对象。
2.this指针是一个常量指针,不能被修改。
3.this指针在每个非静态成员函数中都是可用的,它指向调用该成员函数的对象

用法:

1.在成员函数中可以使用this指针来访问对象的成员变量和成员函数,
以区分局部变量和成员变量同名的情况。
2.可以通过this指针返回对象本身,从而支持链式调用。
3。可以在类的成员函数中将this指针作为参数传递给其他函数,
以便在其他函数中访问当前对象。

2、问题思考

  • this指针储存在哪里?
    在C++中,this指针并不是实际存储在对象中的成员变量中,而是在编译器内部进行处理的。当调用一个成员函数时,编译器会将对象的地址作为隐含的参数传递给成员函数,并将该地址赋给this指针。因此,this指针并不占用对象的内存空间,它只是一个指向调用该成员函数的对象的指针。
    所以显然存储在编译器中栈的位置,某些编译器会直接放在寄存器中,使得高效编译
  • 以下两个程序运行时分别是什么结果?
    Question1:
class test1 {
public:
	void print()
	{
		cout << "print()" << endl;
	}
private:
	int a = 100;
};
int main()
{
	test1* t1=nullptr;
	t1->print();
	return 0;
}

Question 2:

class test2 {
public:
	void print()
	{
		a = 2024;
		cout << a << endl;
	}
private:
	int a = 100;
};
int main()
{
	test2* t2=nullptr;
	t2->print();

	return 0;
}

这两个程序的区别在通过空指针调用函数时是否访问了成员变量,
看似都犯了对空指针解引用的操作错误,实则,底层调用函数时并不需要解引用而是去之前我们提到的公共代码区,所以test1运行正常,而test2由于使用了this指针去调用成员变量则会运行崩溃
在这里插入图片描述
在这里插入图片描述

  • 31
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
在面向对象的编程中,C语言并不直接支持类和抽象的概念。引用中提到,final关键字用来修饰方法,表示该方法不能在子类中被覆盖。而abstract关键字用来修饰抽象方法,表示该方法必须在子类中被实现。然而,在C语言中,没有对应的关键字来实现类和抽象的概念。 相反,C语言通过结构体来模拟类的概念。结构体是一种用户自定义的数据类型,可以包含多个不同类型的数据成员。通过结构体,我们可以将相关的数据和功能组合在一起。然而,C语言中的结构体不支持继承和多态等面向对象的特性。 在C语言中,我们可以使用函数指针来模拟抽象类和接口的概念。函数指针可以指向不同的函数,通过使用函数指针,我们可以实现多态性,即在运行时根据函数指针指向的具体函数来执行不同的操作。 综上所述,C语言并不直接支持面向对象中的类和抽象的概念,但可以使用结构体和函数指针来实现类似的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [面向对象——类和对象](https://blog.csdn.net/shouyeren_st/article/details/126210622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [面向对象编程原则(06)——依赖倒转原则](https://blog.csdn.net/lfdfhl/article/details/126673771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强sir的世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值