C++学习基础知识--this指针、静态成员、常量成员函数

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。

后端开发标签