C++this指针&&友元

本文提供了关于this指针和友元函数的学习资源链接,并解释了它们的基本概念。对于this指针,介绍了其在成员函数中的隐式使用方式;对于友元函数,则澄清了一些常见的误解,并给出了推荐的最佳实践。
this指针学习资源:

1. http://www.cnblogs.com/uniqueliu/archive/2011/09/24/2189545.html
2. http://www.cnblogs.com/hnrainll/archive/2011/05/20/2051939.html
3. http://c.biancheng.net/cpp/biancheng/view/201.html
4. http://blog.sina.com.cn/s/blog_93aa60720100zr5s.html
5. 综上:实际编程时并不需要使用this,因为它是隐含的。即在成员函数中使用某一数据成员时,不需要指出该数据成员是属于哪一个对象,因为每一个数据成员之前都隐含有“this->”。
友元学习资源:
1. http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html
2. http://www.cnblogs.com/renyuan/archive/2013/06/02/3114233.html 纠正:“友元函数不要在类的内部定义,不然编译不会通过”这句话是错误的。许多编译器并未强制限定友元函数必须在使用之前在类外声明。此外,一些编译器允许在尚无友元函数的初始声明的情况下就调用它。不过,推荐敲代码时,最好还是提供一个独立的函数声明,这样即使换了一个有这种强制要求的编译器,也不必更改代码。

<think>嗯,我现在想了解C++中的成员函数是否包含this指针。首先,我得回忆一下函数的基本概念。函数不是类的成员函数,但它们可以访问类的私有和保护成员。那问题来了,成员函数作为的时候,比如类B的成员函数是类A的,这时候这个成员函数里有没有this指针呢? 根据引用[2]里的信息,函数和非函数都是类外函数,不是成员函数,所以不能使用this指针。但这里的情况是,这个函数其实是另一个类的成员函数,比如B::printA()是A的。那B::printA()本身是B的成员函数,应该会有指向B对象的this指针吧?不过当它访问A的私有成员时,比如在printA()里创建了一个A的对象a,然后访问a.name,这时候的this指针应该是指向调用printA()的B对象,而不是a这个A对象。 引用[3]中的例子显示,B::printA()可以访问A的私有成员,而B::printData()不行。这说明当B的成员函数作为A的时,该函数在访问A的实例时不需要通过A的this指针,而是通过权限直接访问。但是,作为B的成员函数,它自身还是有this指针指向调用它的B对象。比如在B::printA()中,如果有访问B的成员变量,就需要用this指针或者隐式使用。 另外,引用[5]提到成员函数在类外定义时需要范围解析运算符,而成员函数虽然是另一个类的成员,但被声明为当前类的。这时候,这个成员函数的this指针属于它原本的类,而不是所属的类。例如,B::printA()的this指针属于B类,当它处理A类对象时,不需要A的this指针,而是直接访问A的实例的私有成员。 总结一下,成员函数作为另一个类的成员函数,它们本身拥有指向自己类实例的this指针,但访问类的私有成员时不依赖该this指针,而是通过权限直接访问目标类的对象成员。因此,成员函数确实包含this指针,但指向的是其所属类的实例,而不是类的实例。</think>在C++中,**成员函数包含this指针**,但该this指针指向的是其所属类的实例,而非类的实例。以下是具体分析: --- ### 1. 成员函数的本质 成员函数是其他类的成员函数,被声明为当前类的。例如: ```cpp class A { public: friend void B::printA(); // B类的成员函数printA是A的 protected: string name = "A"; }; class B { public: void printA(); // B的成员函数 }; ``` - **this指针的存在性**: 作为类B的成员函数,`B::printA()`在调用时隐含一个指向B对象的this指针,用于访问B的非静态成员[^1]。例如: ```cpp void B::printA() { this->someBMember = 42; // 使用this指针访问B的成员 } ``` - **访问类的权限**: 当`B::printA()`访问A的私有成员时,**无需通过A的this指针**,而是直接通过权限操作A的实例: ```cpp void B::printA() { A a; cout << a.name << endl; // 直接访问A的protected成员(无需this指针指向A) } ``` --- ### 2. 关键区别 | 特性 | 成员函数 | 非成员函数 | |---------------------|----------------------------------|----------------------------| | this指针指向 | 所属类的实例(如B对象)[^1] | 所属类的实例(如B对象) | | 访问类私有成员 | 直接通过权限(无需this指针)[^2] | 无法访问 | --- ### 3. 示例验证 引用[3]中的代码清晰地展示了这一机制: ```cpp void B::printA() { A a; cout << a.name << endl; // 合法:权限允许访问A的protected成员 } void B::printData() { A a; cout << a.name << endl; // 非法:非函数无法访问A的protected成员 } ``` - `printA()`作为A的,可直接操作A的实例。 - `printA()`中的this指针仅用于访问B的成员(若需要),与A无关。 --- ### 总结 1. 成员函数包含this指针,但**该指针指向其所属类的实例**(如B对象)[^1]。 2. 访问类的私有成员时,直接通过权限操作目标对象,**无需依赖类的this指针**[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值