1. this指针
在C++类中,this指针是一个指向当前对象的指针。当在类的成员函数中使用this指针时,实际上是在使用当前对象的成员变量和成员函数。C++中的成员函数默认情况下都有一个隐藏的参数this指针,通过该指针可以访问当前对象的成员变量和成员函数。在调用成员函数时,编译器会自动将当前对象的地址作为隐含参数传递给该函数,因此在成员函数内部可以直接通过this指针来访问对象的成员变量和成员函数。
1.1 this指针的使用
当类的成员函数中出现与成员变量同名的局部变量时,需要使用this指针来区分。例如:
class Person{
private:
int age;
public:
void setAge(int age){
this->age = age;
}
};
在上面的代码中,this->age表示当前对象的age成员变量,而age表示setAge函数的局部变量。
2. 静态成员
静态成员属于整个类,而不是某个对象,也就是说,不论创建多少个类的对象,静态成员在内存中只有一份,由该类的所有对象共享。静态成员函数不能访问类的非静态成员,而非静态成员函数可以访问静态成员函数和成员变量。
2.1 静态成员变量的声明和初始化
静态成员变量必须在类外部进行声明和初始化。例如:
class Person{
private:
static int count; // 声明静态成员变量
public:
static void setCount(int c){
count = c;
}
};
int Person::count = 0; // 初始化静态成员变量
在上面的代码中,count是一个静态成员变量,必须在类外进行定义。使用类名加作用域运算符::来定义静态成员变量,并且必须在函数外部进行定义。
2.2 静态成员函数的声明和使用
静态成员函数可以通过类名+作用域运算符::来调用,也可以通过实例对象+作用域运算符::来调用。例如:
class Person{
private:
static int count;
public:
static void setCount(int c){
count = c;
}
static int getCount(){
return count;
}
};
int main(){
Person::setCount(10); // 使用类名进行调用
cout << Person::getCount() << endl; // 使用类名进行调用
Person p;
p.setCount(20); // 使用实例对象进行调用
cout << p.getCount() << endl; // 使用实例对象进行调用
return 0;
}
在上面的代码中,setCount和getCount都是静态成员函数,可以通过类名或实例对象进行访问。静态成员函数不能直接访问非静态成员变量。
3. 常量成员函数
常量成员函数是指在函数声明和定义中,函数参数列表后面加上const关键字的成员函数。常量成员函数没有改变数据成员的权力,因此也称为只读函数或查询函数。
3.1 常量成员函数的声明和定义
常量成员函数被编译器视为不会修改类的成员变量,因此可以被常量对象调用。声明和定义格式如下:
class Person{
private:
int age;
public:
int getAge() const; // 常量成员函数的声明
};
int Person::getAge() const{ // 常量成员函数的定义
this->age = 20; // 编译错误,常量成员函数不能修改数据成员
return this->age;
}
在上面的代码中,getAge函数后面加上了const关键字,表示这是一个常量成员函数,不会修改数据成员。
3.2 常量对象和常量成员函数
常量对象是指被声明为const的对象。常量对象只能调用常量成员函数,不能调用非常量成员函数。
class Person{
private:
int age;
public:
int getAge() const;
void setAge(int age);
};
int Person::getAge() const{
return this->age;
}
void Person::setAge(int age){
this->age = age;
}
int main(){
const Person p; // 常量对象
p.getAge(); // 合法,调用常量成员函数
p.setAge(20); // 非法,常量对象不能调用非常量成员函数
return 0;
}
在上面的代码中,常量对象p只能调用常量成员函数getAge,不能调用非常量成员函数setAge。