C++ this指针的用法
来源:互联网 发布:网络对青少年的利与弊 编辑:程序博客网 时间:2024/06/16 06:31
this指针的含义及其用法:
注解:无论时构造函数还是普通成员变量函数,只要调用就会默认一个指向本对象!
2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。不需要再对其分配一个内存地址,2017/7/24在对类成员函数初始化时,出现了一个严重的的问题,这也是写这篇博客的原因!
注解:代码如下
PAboutDialog::PAboutDialog(QWidget *parent)
: QWidget(parent)
{
//PAboutDialog* PDropWidget = new PAboutDialog();
PDropWidget ->setStyleSheet("background-color: white;");//fause<--
setStyleSheet("background-color: white;"); //right<----
}
3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
4. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
5. 由于this并不是一个常规变量,所以,不能取得this的地址。
6. 在以下场景中,经常需要显式引用this指针
(1) 为实现对象的链式引用(如例1);
(2) 为避免对同一对象进行赋值操作(如例2);
(3) 在实现一些数据结构时,如list.
7. 举例:
//例1:
/* 编辑编译环境:Dev-C++ 4.9.9.2 */
/* file: person.cpp */
#include <stdio.h>
#include <string.h>
class Person {
public:
typedef enum {
BOY = 0,
GIRL = !BOY
} SexType;
public:
Person(char *n, int a, SexType s)
{
name = new char[strlen(n)+1]; //这里的 name 等价于this->name
strcpy(name,n); //这里的 name 等价于this->name
age = a; //这里的 age 等价于this->age
sex = s; //这里的 sex 等价于this->sex
}
int get_age(void) const
{
//age++; //compile error, 因为 age等价于this->age,而 get_age又是一个const成员函数,
//不能对 this指针所指向的这种对象进行修改,这也是const的一个作用。
//这样做的好处是,增加了代码的健壮性。
return age;
}
Person& add_age(int a)
{
age +=a;
return *this; // 返回本对象的引用
}
private:
char *name;
int age;
SexType sex;
};
void TestPerson(void)
{
Person ZhangSan("ZhangSan", 20, Person::BOY);
printf("ZhangSan.age = %d\n", ZhangSan.get_age());
printf("ZhangSan.add_age = %d\n", ZhangSan.add_age(1).get_age()); //增加1岁的同时,可以对新的年龄直接输出;
return;
}
int main(void)
{
TestPerson();
while(1);
}
/* result:
ZhangSan.age = 20
ZhangSan.add_age = 21
*/
//例2:
/* 编辑编译环境:Dev-C++ 4.9.9.2 */
/* file: location.cpp */
#include <stdio.h>
class Location {
int X,Y;//默认为私有的
public:
void init(int x,int y) { X =x; Y = y;};
void assign(Location& pointer);
int GetX(){ return X; }
int GetY(){ return Y; }
};
void Location::assign(Location& pointer)
{
if(&pointer!=this) //同一对象之间的赋值没有意义,所以要保证pointer不等于this
{
X=pointer.X;
Y=pointer.Y;
}
}
int main()
{
Location x;
x.init(5,4);
Location y;
y.assign(x);
printf("x.X = %d, x.Y = %d \n", x.GetX(), x.GetY());
printf("y.X = %d, y.Y = %d ", y.GetX(), y.GetY());
while(1);
return 0;
}
/* result:
x.X = 5, x.Y = 4
y.X = 5, y.Y = 4
*/
- C++this指针的用法
- C++this指针的理解和用法
- C++this指针的理解和用法
- this指针的用法
- this指针的用法
- this指针的用法
- this指针的用法
- this指针的用法
- C++this 指针用法详解
- C ++的this指针
- c++ this指针的用法
- C++ this指针的用法
- 指针的这种用法:this-> -> ->
- C++ this指针的用法
- this指针的用法详解
- C++ this指针的用法
- C++ this指针的用法
- C++ this指针的用法
- ARM寄存器与汇编指令详解
- SetTextSize(),getTextSize()单位问题
- 面试常问的深度学习(DNN、CNN、RNN)的相关问题
- php7扩展声明与获取ini配置
- 解决打包上传一直停留在authenticating with the itunes store问题
- C++ this指针的用法
- scala闭包
- 初识形参实参,C语言模拟pow()函数
- 高精度计算 程序运行时长
- POJ1269(计算几何基础-直线与直线之间的关系与它们的交点)
- Android_Activity的四种启动模式
- http://blog.csdn.net/u013088062
- HTML基础
- 在 JS 中使用 fetch 更加高效地进行网络请求