类和对象(上)

C语言是面向过程的语言,而C++是面向对象的语言

1.在C++中的类和结构体 

1.1类的引入

在C语言中的结构体只能定义变量,而C++中的结构体不仅可以定义变量,也能定义函数。

 在c++中除了struct,还可以用class关键字来定义类,其用法与struct类似

class person
{
private:
	char _name[100];
	int  _age;
	char _id[18];
public:
	void show()
	{
		cout << _name << " " << _age << " " << _id << endl;
	}

};

class包括成员变量和成员函数。成员函数可以在类中定义和声明一起;也可以在类中声明,在其他cpp文件中定义用 (函数返回类型  类名::函数名(参数列表))。但是成员函数在类中定义时,编译器将其看为inline函数。

1.2类的访问限定

类的访问限定符有public,protect,private这三类,默认权限是private。private和protect限定的类成员和类函数,出了类就不能访问,一般是将类成员定义为private,类函数当做接口定义为public

而struct的默认权限是public(因为要兼容c)struct也可以定义类。

因此在c++中创建一个结构体实例跟类相同,只需要(类名/结构体名 例名)例如 stu a1,不再需要像c语言中的struct stu a1;

2.面向对象的三大特征:封装,继承,多态

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节(通过访问限定符),仅开发接口实现对对象的交互

3.类的实例化

用类创建对象的过程叫做类的实例化,值得注意的是,在实例化之前,类中的变量是声明,并没有开辟实际的空间,当我们例如peson clau.s 后,创建了claus这个实例后才会实际开辟空间存储类的变量.类就像一个设计图,而用设计图建造的房子是我们的实例化出的对象。

4.类对象存储方式

每个实例化出的对象,只会保存类的成员变量(如果每个类对象都放成员函数的话就会浪费空间),而类函数放在公共代码区,当需要时才会去调用。因此当我们用sizeof计算类的大小时,大小就是类成员变量的大小(要考虑对齐)。当没有类成员变量时,大小是一个字节,不是用来存储数据,而是用来占位,表示类对象存在。

5.this指针

class person
{
private:
	char _name[100];
	int  _age;
	char _id[18];
public:
	void init(const char* name, int age,const char* id)
	{
		strcpy(_name, name);
		_age = age;
		strcpy(_id, id);

	}
	void show()
	{
		cout << _name << " " << _age << " " << _id << endl;
	}
};
int main()
{
	person a;
	a.init("claus", 18, "1852645");
	person b;
	b.init("klaus", 19, "1564da");
	a.show();
}

我们看这份代码,可以成功运行

但是在最后一个调用a.show(),时,我们并没有传递任何参数,而且函数放在的是公共代码区,所用对象公用一个函数,为何可以成功的找到a的成员变量。

其实原因是我们这里其实自动传了指针。

 可见,C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数,该指针指向当前对象,函数中所用成员变量的操作都是通过该指针去访问的.

5.1this指针的特性

tihs指针的类型是类型*const,即不能改变指针。this指针只能在成员函数中使用,this指针本质是成员函数的形参,当对象调用函数是会自动将对象的地址作为实参传递给this指针。说以this指针在栈区。由编译器通过ecx寄存器自动传递。调用上述代码时我们可以观察到。

题:

#include<iostream>
using namespace std;
class A
{
private:
	int _a;
public:
	void print()
	{
		cout << "hello" << endl;
	}
	void print_a()
	{
		cout << _a << endl;
	}
};

int main()
{
	A* a1 = nullptr;
	a1->print(); // 成功运行
	a1->print_a(); // 程序崩溃
	return 0;
}

为何print能成功运行,因为在这里的->并不是在a1中找print,而是将a1当成实参传递给隐形指针this,而print函数中并没有使用到this指针,因此不会报错,而print_a中在打印_a时实际上用了this->_a,用了this指针,因此报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值