C++ 类与对象(一)

C++中引入了类与对象的概念,这是与C语言(面相过程)最大的区别。引入面相对象(OOP)概念之后,使得C++在进行软件开发时变得非常方便。类可以理解为某一类事物,比如说人、猫、狗、电脑、自行车等某一类事物。类的特点是有数据、行为,其中数据代表各种数据类型变量、常量,而行为可以理解为代表实现各种功能的函数,把它们都封装在我们自己定义的类里面,这样通过创建类实体,也就是new一个对象的形式来使用类的属性(数据、行为),这样就非常方面了。

举个例子,比如把人定义为一个类,那么类的成员数据可以是人的一些基本数据,例如身高、体重、三围之类的,而行为就比较多了,例如吃饭、睡觉、各种爱好、跑等等能干的事情都可以看作是一个行为,也就是可以定义为函数。

说完这么多,你肯定对类与对象有了初步的认识了吧,下面让我们看下具体代码:

在C++中,引入了private、 public 等限定符来修饰类的成员数据和成员函数,这东西就是为了后面设计软件时给不同的用户分配不同的权限的(我目前是这样理解的)。总而言之,不能所有人都一样吧,那世界就乱了!

下面介绍类中常见的一些知识。

1.通过类的公有成员函数去访问类的私有成员数据,上代码

#include<iostream>

using namespace std;

class CTest {
private:
	int x, y;
public:
	void setxy(int a, int b) {
		x = a;
		y = b;
	}
	void printxy() {
		cout << "x=" << x << ",y=" << y << endl;
	}
};
int main() {
	CTest obj;//创建对象
	obj.setxy(1, 2);//通过公有成员函数为私有成员数据赋值
	obj.printxy();//通过公有成员函数输出私有成员数据

	return 0;
}
//输出 x=1,y=2

2.通过指针和公有函数去访问私有成员数据,上代码

#include<iostream>

using namespace std;

class CTest {
private:
	int x, y;
public:
	void setxy(int a, int b) {
		x = a;
		y = b;
	}
	void printxy() {
		cout << "x=" << x << ",y=" << y << endl;
	}
	void getxy(int* px, int* py) {//公有函数,定义指针
		*px = x;
		*py = y;
	}
};
int main() {
	CTest obj;
	obj.setxy(1, 2);
	obj.printxy();

	int m, n;
	obj.getxy(&m, &n);//通过参数指针接受m n地址去访问x y的值,给m n赋值
	cout << "m=" << m << ",n=" << n << endl;

	return 0;
}
//输出 x=1,y=2
//     m=1,n=2

3.通过引用访问类的私有成员数据,上代码

#include<iostream>

using namespace std;

class CTest {
private:
	int x, y;
public:
	void setxy(int a, int b) {
		x = a;
		y = b;
	}
	void printxy() {
		cout << "x=" << x << ",y=" << y << endl;
	}
	void getxy(int& px, int& py) {
    //这里通过引用访问私有成员数据,其实px py和m n临时共有内存空间
		px = x;
		py = y;
	}
};
int main() {
	CTest obj;
	obj.setxy(1, 2);
	obj.printxy();

	int m, n;
	obj.getxy(m, n);//引用共用内存空间
	cout << "m=" << m << ",n=" << n << endl;

	return 0;
}
//输出
// x=1,y=2
// m=1,n=2

这里要说一下指针和引用的区别:是创建一个指针变量,指向另一个变量的,且指针变量的类型要与指向变量必须相同。所以指针变量本身也是占据内存空间的,只不过它存储的值是指向变量的内存地址而已。而引用不一样,引用是与所引用变量共用一块内存空间的,这点要注意。嫌弃我啰嗦的直接看代码:

指针:

#include<iostream>

using namespace std;

int main() {
	int a = 1;
	int* p = &a;


	cout << "a=" << a << ",*p=" << *p << endl;
	cout << "&a=" << &a << ",p=" << p << ",&p=" << &p << endl;

	return 0;
}

引用:

#include<iostream>

using namespace std;

int main() {
	int a = 1;
	int& p = a;


	cout << "a=" << a << ",p=" << p << endl;
	cout << "&a=" << &a << ",p=" << p << ",&p=" << &p << endl;

	return 0;
}

 4.重载,类中对同名的成员函数可以进行重载,方式包括参数个数、参数类型不同,上代码

#include<iostream>

using namespace std;

class CTest {
private:
	int x, y, m, n;
public:
	void setxymn(int a, int b) {
		x = a;
		y = b;
	}
	void setxymn(int a, int b, int c, int d) {
		x = a;
		y = b;
		m = c;
		n = d;
	}
	void printxymn() {
		printf("x = %d, y = %d\n", x, y);
	}
	void printxymn(int w) {
		printf("x = %d, y = %d, m = %d, n = %d\n", x, y, m, n);
	}
};
int main() {
	CTest obj;
	obj.setxymn(1, 2);
	obj.printxymn();
	//参数个数不同

	obj.setxymn(1, 2, 3, 4);
	obj.printxymn(666);
	//参数类型不同

	return 0;
}

5.还可以通过对象指针的方式访问类的成员数据和成员函数,上代码:

#include<iostream>

using namespace std;

class CTest {
private:
	int x, y;
public:
	void setxy(int a, int b) {
		x = a;
		y = b;
	}
	void print() {
		cout << "x=" << x << ",y=" << y << endl;
	}
};
int main() {
	CTest obj;
	CTest* pobj = &obj;//定义指针对象,并初始化赋值

	pobj->setxy(1, 2);
	pobj->print();
	//通过指针去访问私有成员数据

	return 0;
}

 6.类的this指针,可以理解为创建对象时默认就有一个this指针,它就是指向对象的,上代码:

#include<iostream>

using namespace std;

class CTest {
private:
	int x;
public:
	int getx() {
		return x;
	}
	void setx(int x) {
		this->x = x;
		cout << "this指针存储的内存地址为:" << this << endl;
	}
};
int main() {
	CTest obj;
	obj.setx(888);
	cout << "对象obj在内存的地址为:" << &obj << endl; 
	cout << "对象obj所保存的值为:" << obj.getx() << endl;
	//由输出可见,this指针就是指向的对象obj
	//目前所理解的是this就是在类里方面操作,为了和形参区别的,this就是一个指针
	//比如这个程序,形参是x, 类的私有成员也是x,就可以通过this->x这种形式进行区别。
	return 0;
}

虽然上面这些都是面相对象基础的内容,但是也要好好理解,不然以后就听不懂了。

第一次写博客,还不太会哈哈,希望以后多学习吧,加油!

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值