this指针指向用来调用成员函数的对象,被作为隐藏参数传递给方法。
换句话说就是,一个对象调用了一个类方法,在类方法中,则默认为this->数据成员。
在没有引入this指针之前,类的成员函数只能设计一个类对象,但是很多类方法可能涉及两个类对象,此时this指针可以访问调用成员函数的类,而另外的类对象可以作为成员函数的参数。
class Student
{
private:
string name;
string address;
int age;
public:
Student(const string t_name, string t_addr, int t_age); 普通构造函数
Student(); 默认构造函数
~Student(); 析构函数
void Showmessage();
const Student & Compare(const Student & s) const;
};
Student::Student(const string t_name, string t_addr, int t_age)
{
name = t_name;
address = t_addr;
age = t_age;
}
Student::Student()
{
name = "temp_name";
address = "temp_addr";
age = 0;
}
Student::~Student()
{
}
const Student & Student::Compare(const Student & s) const
{
if(s.age > age)
return s;
else
return *this; *this为调用对象的别名
}
1、上述程序中const Student & Compare(const Student & s) const;括号中的const表示不能修改显示访问的对象,函数后面的const表示不会改变调用此函数的对象,返回值为const Student &表示返回的是对象本身,而不是副本,且不能被修改。
2、this指针指向调用对象,则*this为调用对象的别名。
试想如果没有this指针将会怎样?
1、无法同时设计多个对象; 2、只能返回传入的参数对象。而不能返回调用此成员函数的对象;2、对象数组
声明对象数组和结构体数组差不多:
1、 结构体数组
typedef struct
{
string name;
string address;
int age;
}Stu;
Stu stu[3] = {{...},{...},{...}}; 直接初始化
2、 对象数组
Student student[3]; 使用默认构造函数完成对象数组的初始化
3、 对象数组的初始化
如果不使用默认构造函数完成初始化,将对数组中的每个对象都要使用普通构造函数完成初始化
Student student[3] = {
Student("fhl","hubei",26),
Student("wy","hubei",24),
Student("fhy","hubei",23),
};
3、类作用域
3.1、访问限制
类中定义的数据成员和成员函数的作用域为整个类,即在类中已知,类外不可知,因此类外不可直接访问类的数据成员和成员函数。 1、 公有成员函数必须通过类对象调用; 2、 访问数据成员,必须通过公有成员函数; 3、 定义公有成员函数时,必须使用作用域解析运算符。3.2、所有对象共享常量
方式一:在类中声明一个枚举
class Student
{
private:
enum {age = 26};
string name;
string address;
int age;
public:
Student(const string t_name, string t_addr); 普通构造函数
Student(); 默认构造函数
~Student(); 析构函数
void Showmessage();
const Student & Compare(const Student & s) const;
};
此处的枚举只是一个符号名称,并不会真的创建这样的枚举成员,因此不需要提供枚举名,并且在后面遇到age时,都将使用26来替代
方式二:在类中使用关键字static
class Student
{
private:
static const int age = 26;
string name;
string address;
int age;
public:
Student(const string t_name, string t_addr); 普通构造函数
Student(); 默认构造函数
~Student(); 析构函数
void Showmessage();
const Student & Compare(const Student & s) const;
};
使之成为静态成员变量,本身不属于任何对象,所有对象共享数据,一处修改,其他地方的引用均被修改



