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;
}
虽然上面这些都是面相对象基础的内容,但是也要好好理解,不然以后就听不懂了。
第一次写博客,还不太会哈哈,希望以后多学习吧,加油!