上回讨论了类的构造和析构函数,这会我们来讨论类的其他基本特性
this指针
我们一直在讨论单一对象,但是很多时候我们操作的并不只是单一对象,比如下面一个例子
假设我们在原本的Student类中添加一个函数,比较两个学生的goal值的大小,并返回最大的那一个
#include<iostream>
class Student
{
int scr;
int goal;
public:
void set(int a,int b){
scr = a;
goal =b;
}
void show(){
std::cout<< scr <<"\n"<< goal;
}
Student & compare(Student & s){
if(s.goal > goal)
return s;
else
return ???;
}
};
int main(){
Student abc;
abc.set(40,60);
abc.show();
return 0;
}
我们在Student类中添加了一个compare函数,它接受一个Student对象引用,并且返回一个Student对象引用 ,我们来梳理一下逻辑链
if语句判断传入的对象的goal值和本对象的goal值的大小,返回较大的值,如果传入的值大于本对象的值,则返回传入的对象,那如果是本对象的值较大呢?
那返回什么呢?return ???
我们发现,这时我们需要返回本对象,但是我们缺乏表示本对象的能力
怎么办呢?我们就需要this指针了
this指针指向调用成员函数的对象,也就是指向本对象
一般来说,所有的类方法都将this指针设置为掉用它对象的地址,比如,show()中的src只不过是this->src
所以,我们只要返回*this(*即作为解除引用运算符),return*this就可以了
类和结构
如果有稍微了解C++,那么看到这里会觉得有些熟悉,怎么和结构这么像!?
是的,没错,其实结构和类没有什么太大的不同,但是结构中的数据结构默认为public,但是类中的默认为private
对象数组
我们知道类是一种由用户定义的数据结构,通常我们可以声明一个个独立的对象,那么我们是否可以声明一个对象的集合呢?
当然可以!
Student complex[4];
complex[0].show();
complex[1].show();
对于complex[n]都是Student对象,都可以操作公有成员函数
那么怎么对其进行初始化?我们可以使用非默认构造函数进行显性构造
Student complex[4] = {
Student(40,60);
Student(50,70);
}
但是这里有一个很奇妙的点,我们并不需要对对象数组中的每一个对象进行显性构造,我们可以只构造一部分,剩下的元素将使用默认构造函数进行隐性构造
类的作用域
类的数据成员和类成员函数的作用域有且仅在整个类当中,所以,除了类声明和成员函数定义时,可以直接使用类名,其他时候,都需要对对象使用直接成员运算符(.),间接成员运算符(->),或者作用域解析符
Student abc; //allowed
Student *abcd= new Student;
void Student::Student(){
} //allowed
Student.show(); //unallowed
abc.show(); //allowed
abcd ->show(); //allowed
和函数类似,在函数的定义域中,我们可以利用局部变量来做很多事
int compare(int a,int b){
if (a>b)
return a;
else
return b;
}
compare(3,4)
像a和b就是一个局部变量,在调用函数时把3和4赋值给a和b,再比较大小
class dog
{
int number = 10;
double dogs{number};
}
那这样的代码是否行的通呢?
很遗憾,这并不行,因为在利用类创建对象前,没有用于储存值的空间,第二行代码中,编译器并不知道什么是number和它的值
那怎么办呢?我们可以在类中创建一个常量,位于类的作用域,很显然,是不能用C的宏命令#define的,但其实,即使可以用,也最好不要依赖C++里的C实现,这一般会使得代码很不规范,我们可以利用static创建常量,或者利用枚举创建符号常量,但即使是这样,对于编译器,其中的number仍然会被解释称数字10
class dog
{
static int number = 10;
double dogs{number};
}
class dog
{
enum{number = 10};
double dogs{number};
}
而number作为一个常量,会和其他静态存储对象放在一起,而不在类和对象里
尾声
感谢观看!下一期会继续讨论类的特性!