一、this指针

1、C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!

2C++中类的普通成员函数都隐式包含一个指向当前对象的this指针。

3、静态成员函数、成员变量属于类

4、静态成员函数与普通成员函数的区别

静态成员函数不包含指向具体对象的指针,静态成员函数只能访问静态成员变量

普通成员函数包含一个指向具体对象的指针

this指针不是const Test  *test;                      //this->a=100; 正确

this指针时一个常指针 是 Test * const test;  //this++; 错误

二、const修饰成员函数 到底修饰谁

//1 const 写在哪个位置 没有关系

void  OpVar(int a, int b)  const  等价于 void const OpVar(int a, int b)  等价于 const  void  OpVar(int a, int b) 
    //2 const 修饰的是谁
    //2-1 const 修饰的形参a  不是
    //2-1 const 修饰的是属性this->a this->b
    //2-3 const 修饰的是this指针所指向的内存空间 修饰的是this指针
    //void  OpVar(int a, int b) { //===>void OpVar(Test *const this,int a, int b)
    void const OpVar(int a, int b)  const { //===>void OpVar(const Test * const this,int a, int b)  Test内存指向的空间不可更改

总结:类的成员函数尾部出现const修饰,修饰的是this指针,意思是不可更改this指针指向的内容

三、全局函数和成员函数的转换

1、把全局函数转化成成员函数,通过this指针隐藏左操作数

Test add(Test &t1, Test &t2)===》Test add(Test &t2)

2、把成员函数转换成全局函数,多了一个参数

void printAB()===》void printAB(Test *pthis)

四、函数返回元素和引用

如果相对一个对象连续调用成员方法,每次都会改变对象本身,成员方法需要返回引用

Test& add(Test &t2) //*this //函数返回引⽤

{

this->a = this->a + t2.getA();

this->b = this->b + t2.getB();

return *this; //*操作让this指针回到元素状态

}

Test add2(Test &t2) //*this //函数返回元素

{

//t3是局部变量

Test t3(this->a+t2.getA(), this->b + t2.getB()) ;

return t3;

}

this指针和const修饰函数应用举例:

#if 1
#include<iostream>
using namespace std;
class Test {
public:Test(int a, int b) { //--->Test(Test *this,int a,int b)this->a = a;this->b = b;}void printT() {cout << "a:" << a << endl;cout << "a:" << this->b << endl;}//1 const 写的是什么位置 没有关系//2 const 修饰的是谁//2-1 const 修饰的形参a  不是//2-1 const 修饰的是属性this->a this->b//2-3 const 修饰的是this指针所指向的内存空间 修饰的是this指针//void  OpVar(int a, int b)  const { //===>void OpVar(Test *const this,int a, int b) const  void const OpVar(int a, int b)  const { //===>void OpVar(const Test * const this,int a, int b) const  Test内存指向的空间不可更改a = 100;//this->a = 100;  报错//this->b = 100;cout << a << endl;cout << b << endl;}
protected:
private:int a;int b;
};void main() {Test t1(1, 2);t1.printT();  //printT(&t1)cout << "hello" << endl;
}
#endif

全局函数和成员函数应用举例:

#if 1
#include<iostream>
using namespace std;
class Test
{
public:int a;int b;
public:Test(int a=0, int b=0) {this->a = a;this->b = b;}Test(int a) {this->a = a;this->b = 0;}Test TestAdd1(Test &t1) {/*Test t(0, 0);t.a = a + t1.b;t.b = b + t1.b;*/Test t(this->a + t1.a, this->b + t1.b);return t;}void TestAdd2(Test &t1) {this->a = a + t1.a;this->b = b + t1.b;}//返回一个引用 相当于返回变量自身Test& TestAdd3(Test &t1) {this->a = this->a + t1.a;this->b = this->b + t1.b;return *this;  //相当于把*(&t1)又回到了t1元素}void printT() {cout << "a:" << a << endl;cout << "b:" << b<<endl;}~Test() {cout << "析构函数" << endl;}};
//把成员函数转换成 全局函数 多一个参数
void printT(Test *pT) {cout << "a:" << pT->a << endl;cout << "b:" << pT->b << endl;
}
//全局函数 转成 成员函数 少一个参数
Test TestAdd(Test &t1, Test &t2) {Test t(0,0);t.a = t1.a + t2.a;t.b = t1.b + t2.b;return t;
}
void test01() {Test t1(1, 2);Test t2(3, 4);Test t3;//全局函数方法t3= TestAdd(t1, t2);
}
/*
析构函数
析构函数
析构函数
析构函数
析构函数
*/
void test02() {Test t1(1, 2);Test t2(3, 4);{//成员函数方法Test t3 = t1.TestAdd1(t2);  //匿名对象直接转化为t3t3.printT();Test t4;t4 = t1.TestAdd1(t2);  //匿名对象复制给t4t4.printT();}t1.TestAdd2(t2);
}
/*
析构函数
a:4
b:6
析构函数
析构函数
a:4
b:6
析构函数
析构函数
析构函数
析构函数
*/
void test03() {Test t1(1, 2);Test t2(3, 4);//t2=t2+t1;t2.TestAdd2(t1);t2.printT();t2.TestAdd3(t1);t2.printT();
}
/*
a:4
b:6
a:5
b:8
析构函数
析构函数
*/
int main() {//test01();//test02();test03();return 0;
}
#endif

函数返回引用和元素示例:

#if 1
#include<iostream>
using namespace std;
class Test
{
public:int a;int b;
public:Test(int a = 0, int b = 0) {this->a = a;this->b = b;}Test(int a) {this->a = a;this->b = 0;}Test TestAdd1(Test &t1) {Test t(this->a + t1.a, this->b + t1.b);return t;}void TestAdd2(Test &t1) {this->a = a + t1.a;this->b = b + t1.b;}Test TestAdd3(Test &t1) {this->a = this->a + t1.a;this->b = this->b + t1.b;return *this;    //如果想返回一个对象的本身,在成员方法中 使用*this返回}//返回一个引用 相当于返回变量自身Test& TestAdd4(Test &t1) {this->a = this->a + t1.a;this->b = this->b + t1.b;return *this;  //相当于把*(&t1)又回到了t1元素}void printT() {cout << "a:" << a << "  b:" << b << endl;}~Test() {cout << "析构函数" << endl;}};
//Test TestAdd1(Test &t1)
//void TestAdd2(Test &t1)
//Test TestAdd3(Test &t1)
//Test& TestAdd4(Test &t1)
void test01() {Test t1(10, 20);Test t2(100, 200);Test t3 = t1.TestAdd1(t2);t3.printT();
}
/*
析构函数
a:110  b:220
析构函数
析构函数
析构函数
*/
void test02() {Test t1(10, 20);Test t2(100, 200);t1.TestAdd2(t2);t1.printT();
}
/*
a:110  b:220
析构函数
析构函数
*/
void test03() {Test t1(10, 20);Test t2(100, 200);//((t1 += t2) += t2 )+= t2;//t1.TestAdd2(t2).TestAdd2(t2); 报错 无法连加 t1.TestAdd2(t2)返回值为空t1.TestAdd3(t2).TestAdd3(t2);  //a:110  b:220 //t1.TestAdd3(t2)返回为匿名对象//所以在第二次.TestAdd3(t2)时是匿名对象的相加,并不是t1t1.printT();
}
/*
析构函数
析构函数
a:110  b:220
析构函数
析构函数
*/
void test04() {Test t1(10, 20);Test t2(100, 200);//如果相对一个对象连续调用成员方法,每次都会改变对象本身,成员方法需要返回引用t1.TestAdd4(t2).TestAdd4(t2);   //a:210  b:420 //t1.TestAdd4(t2)返回的是计算后的对象本身//所以在第二次.TestAdd4(t2)时是计算后的对象相加t1.printT();
}
/*
a:210  b:420
析构函数
析构函数
*/
int main() {cout << "-----------test01-----------" << endl;test01();cout << "-----------test02-----------" << endl;test02();cout << "-----------test03-----------" << endl;test03();cout << "-----------test04-----------" << endl;test04();return 0;
}
#endif

C++基础08-this指针-const修饰成员函数-函数返回引用/值相关推荐

  1. c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象

    目录 4.3 C++对象模型和this指针 4.3.1 成员变量和成员函数分开存储 4.3.2 this指针概念(非常重要) 4.3.3 空指针访问成员函数 4.3.4 const修饰成员函数 相关教 ...

  2. C++学习笔记(十)成员变量和成员函数分开存储、this指针、空指针访问成员函数、const修饰成员函数、友元

    1.成员变量和成员函数分开存储 //1.在C++中,类内的成员变量和成员函数分开存储 //2.只有非静态成员变量才属于类的对象上 //空对象占用内存空间为:1 //C++编译器会给每个空对象也分配一个 ...

  3. const修饰成员函数总结

    const修饰成员函数有两个理由 1 让类的接口更容易理解,因为这可以方便程序员知道那个函数可以改变对象内容,而那个函数不能改. 2 让类能够操作const对象. 有一个非常重要的C++特性是 两个成 ...

  4. C++ 常函数(const修饰成员函数)

    常函数 const修饰成员函数 const修饰成员函数 常函数: 1.成员函数后加const后我们称这个函数为常函数. 2.常函数不可以修改成员属性. 3.成员属性声明时加关键字mutable后,在常 ...

  5. 黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例)

    黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例) 一.60 指针-const修饰指针 二 ...

  6. 类和对象—对象特性—const修饰成员函数

    常函数: 成员函数后加const后我们称这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键词mutable 后在常函数中依然可以修改 常对象 声明对象前加 const称该对象为常对象 ...

  7. c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数

    十一.指针 (1)指针的定义和使用 指针的作用:可以通过指针间接访问内存. 参考视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&a ...

  8. C++const修饰成员函数

    C++全局函数做友元 常函数 常对象 示例 常函数 成员函数后加const后我们称为这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象 ...

  9. C语言 const 修饰函数返回值 - C语言零基础入门教程

    目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 二.const 修饰在函数名前面 三.const 修饰在函数名后面 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

最新文章

  1. Java学习总结:24
  2. Spring MVC学习笔记——POJO和DispatcherServlet
  3. linux shell审计--snoopy的注意事项
  4. linux网络编程之用epoll实现io复用(基于tcp)
  5. 面试题 gety() getTop() TranslationY关系
  6. 漫话:如何给女朋友解释为什么Java线程没有Running状态?
  7. ios自带连点器一秒10000下_这6个iOS隐藏技巧让你的iPhone更高效 超级实用
  8. python 去掉文件后缀_python从zip中删除指定后缀文件(推荐)
  9. c++ primer plus 复合类型之数组
  10. linux 程序或服务开机自启动
  11. django session过期设置
  12. 2022最全知识点——RF接口自动化框架项目实战
  13. 使用kon-boot绕过win10或其他版本密码
  14. linux解压文件卡住,linux停解压文件
  15. 使用Flash地图控件AnyMap创建Dashboard Drilldown Maps
  16. Java基础知识和进阶
  17. OA多级审批流程表设计方案(干货满满)
  18. Android 简单直接--无需jar包zing实现生成、扫描二维码
  19. gazebo实现小车巡线
  20. R语言List列表和向量Vector互相转化源码和思路

热门文章

  1. Java数据库篇8——索引、视图、存储过程、触发器
  2. 07 - java 方法里面的 return
  3. 底层实现_Java AOP的底层实现原理
  4. oracle执行计划的概念,SQL语句性能调整之ORACLE的执行计划
  5. 单链表的代码python_python版本单链表实现代码
  6. c++代码根据点位连线_邹军:数控车倒角C与自动倒圆角R编程方法
  7. 计算机科学陈国华,科学网—模式识别与智能系统是个什么专业? - 晏燕华的博文...
  8. 基础练习 FJ的字符串 递推 C++
  9. HTML+CSS+JS实现 ❤️CSS3图片遮罩高亮显示❤️
  10. mysql触发器如何获取当前表名_MCGS pro组态环境下,如何获取当前用户名,在画面上显示?...