• this指针和相关的用处——C++


    this的特性:
    1. this指针的类型: 类类型* const ,即可以改变指针指向对象里面的内容,但不能改变指针的指向
    2. 只能在“成员函数”的内部使用
    3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针当调用成员函数的时候,this指针会存在于栈帧中
    4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递(看不见,但是有这个形参,用户可以使用

    在成员函数中隐含的this指针就如下图,使用对象内部的成员变量或成员函数会默认用this指向,表明该成员变量或成员函数属于该对象的内部成员
    在这里插入图片描述


    面试题:

    1. this指针存在哪里?
      没有调用成员函数的时候this指针是不存在的,当调用成员函数的时候,建立成员函数的栈帧,类对象的地址作为实参传递给this形参,该形参就在栈帧中,一般通过ecx寄存器自动传递
    2. this指针可以为空吗?
    // 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
    class A
    {
       
    public:
    	void Print()
     	{
       
     		cout << "Print()" << endl;
     	}
    private:
     	int _a;
    };
    int main()
    {
       
    	A* p = nullptr;
    	p->Print();
    	return 0;
    }
    
    // 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
    class A
    {
        
    public:
        void PrintA() 
        {
       
        	cout<<_a<<endl;
        }
    private:
    	int _a;
    };
    int main()
    {
       
        A* p = nullptr;
        p->PrintA();
        return 0;
    }
    

    所以空指针也是可以作为实参传递给形参this的,运行的结果具体看里面函数的实现


    比较C语言和C++实现Stack的不同

    C语言下的Stack

    typedef int DataType;
    typedef struct Stack
    {
       
    	DataType* array;
    	int capacity;
    	int size;
    }Stack;
    
    void StackInit(Stack* ps)
    {
       
    	assert(ps);
    	ps->array = (DataType*)malloc(sizeof(DataType) * 3);
    	if (NULL == ps->array)
    	{
       
    		assert
  • 相关阅读:
    国庆值得入手的蓝牙耳机哪款好?入耳式蓝牙耳机推荐
    企业信息化整体解决方案
    利用Freemaker导出word时的常用语法示例
    QT项目移植到VS+QT(RTI-DDS)
    KL变换(PCA主成分分析)
    函数的参数
    Spring Security对接OIDC(OAuth2)外部认证
    猿创征文|【React 三】组件实例的三大属性(state、props、refs)
    C#面:XML与 HTML 的主要区别是什么
    使用PowerShell脚本来一键开启、关闭FTP服务
  • 原文地址:https://blog.csdn.net/iqrmshrt/article/details/127100977