this指针

学到哪里是哪里,关于this指针,摘录目前自己需要的部分,更多的待以后补充

 

this指针容易混淆点
1) 什么是this指针?
this是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。举例来说:当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身。
2) this指针的作用是什么?
this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
 

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: 
    void Date::setMonth( int mn ) 
    { 
     month = mn; // 这三句是等价的 
     this->month = mn; 
     (*this).month = mn; 
    } 
1. this只能在成员函数中使用。
全局函数,静态函数都不能使用this。
实际上,成员函数默认第一个参数为T* const register this。
如: 
class A{public: int func(int p){}};
其中,func的原型在编译器看来应该是: int func(A* const register this, int p); 

相当于以下代码:


class  student
{
public:
    void Infostudent(char * name, char* gender, int  age)
    //实际为void Infostudent(student *const this,char *name ,char *gender,int age);
    {
        strcpy(_name, name);
        strcpy(_gender, gender);
        _age = age;
    }
    void Printstudent()
    {
        cout << _name << "\n" << _gender << "\n" << _age << endl;
    }
private:
    char _name[20];
    char _gender[4];
    int _age;
};

由文中注释可知,类中的第一参数 name 便是 this 指针的地址。

类中的就近原则:

(1)在成员函数中,当局部变量与成员变量重名时,该变量指向的是局部变量。

class Object
{
public:
int x;    // 成员变量
voic Test(int x)
{
printf("x = %d \n", x);    //  最近的,函数内定义的x
}
};

 此时若是在main()中输入:

x = 1,

Object obj;

obj.Test(2);   此时输出x = 1;

如果指定成员变量x,则必须加上this->的限定,即:

class Object
{
public:
int x;
void Test(int x)
{
printf("x = %d \n", this->x);
}
}

如前面所说的,此时调用Test()函数,

Object obj;

obj.Test(2); 则打印出来是2。

(2)在成员函数里,当成员函数与全局变量重名时,该变量指向的是成员变量

int x = 10;    // 全局变量
class Object
{
public:
int x;
void Test(int)
{
printf("x = %d \n", x);    // 最近的x,成员变量x
}
}

int main()
{
Object obj;
obj.x = 1;
obj.Test();
}

此时打印出来的x = 1,如果要调用全局变量,则要加上::x

如果要打印全局变量,则函数如下:

Test()

{

printf("x = %d \n", ::x);

}

同理成员函数和全局函数

1. 内容概要 本项目是一个支持科学函数的命令行计算器,兼容 C++98 标准。它实现了中缀表达式词法分析、后缀表达式转换与求值,支持常见数学运算(如幂、三角函数、对数等)与括号优先级解析。程序还提供了角度版三角函数、角度与弧度互转功能,并支持函数调试输出与函数演示模式。 2. 适用人群 * C++ 初中级学习者,特别是希望深入理解表达式求值机制者 * 需要一个可扩展的计算引擎的项目开发者 * 想通过项目实践词法分析、调度场算法、数学函数封装的开发者 * 高校学生课程设计、编译原理实践者 3. 使用场景及目标 * 实现中缀表达式的完整求解器,支持函数嵌套、优先级与结合性处理 * 提供角度与弧度版本的三角函数,以适应不同输入偏好 * 演示中缀转后缀过程,辅助编程教育与算法教学 * 提供科学函数辅助计算,如 `log`, `sqrt`, `abs`, `exp`, `ceil`, `floor` 等 4. 其他说明 * 支持函数:sin, cos, tan(弧度);sind, cosd, tand(角度) * 支持函数嵌套,如 `sin(deg2rad(30))` * 支持操作符:+, -, \*, /, ^, \*\*(幂运算)与括号优先级 * 所有函数均通过 map 注册,方便扩展与自定义 * 输入 `help` 查看支持函数,`demo` 观看转后缀过程,`quit` 退出程序 * 提示用户避免使用 `°` 符号,推荐使用角度函数代替 * 可通过 `g++ calculator.cpp -o calculator -lm` 编译(需链接数学库)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值