C++基础08-this指针-const修饰成员函数-函数返回引用/值
一、this指针
1、C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!
2、C++中类的普通成员函数都隐式包含一个指向当前对象的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修饰成员函数-函数返回引用/值相关推荐
- 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修饰成员函数 相关教 ...
- C++学习笔记(十)成员变量和成员函数分开存储、this指针、空指针访问成员函数、const修饰成员函数、友元
1.成员变量和成员函数分开存储 //1.在C++中,类内的成员变量和成员函数分开存储 //2.只有非静态成员变量才属于类的对象上 //空对象占用内存空间为:1 //C++编译器会给每个空对象也分配一个 ...
- const修饰成员函数总结
const修饰成员函数有两个理由 1 让类的接口更容易理解,因为这可以方便程序员知道那个函数可以改变对象内容,而那个函数不能改. 2 让类能够操作const对象. 有一个非常重要的C++特性是 两个成 ...
- C++ 常函数(const修饰成员函数)
常函数 const修饰成员函数 const修饰成员函数 常函数: 1.成员函数后加const后我们称这个函数为常函数. 2.常函数不可以修改成员属性. 3.成员属性声明时加关键字mutable后,在常 ...
- 黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例)
黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例) 一.60 指针-const修饰指针 二 ...
- 类和对象—对象特性—const修饰成员函数
常函数: 成员函数后加const后我们称这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键词mutable 后在常函数中依然可以修改 常对象 声明对象前加 const称该对象为常对象 ...
- c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数
十一.指针 (1)指针的定义和使用 指针的作用:可以通过指针间接访问内存. 参考视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&a ...
- C++const修饰成员函数
C++全局函数做友元 常函数 常对象 示例 常函数 成员函数后加const后我们称为这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象 ...
- C语言 const 修饰函数返回值 - C语言零基础入门教程
目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 二.const 修饰在函数名前面 三.const 修饰在函数名后面 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...
最新文章
- Java学习总结:24
- Spring MVC学习笔记——POJO和DispatcherServlet
- linux shell审计--snoopy的注意事项
- linux网络编程之用epoll实现io复用(基于tcp)
- 面试题 gety() getTop() TranslationY关系
- 漫话:如何给女朋友解释为什么Java线程没有Running状态?
- ios自带连点器一秒10000下_这6个iOS隐藏技巧让你的iPhone更高效 超级实用
- python 去掉文件后缀_python从zip中删除指定后缀文件(推荐)
- c++ primer plus 复合类型之数组
- linux 程序或服务开机自启动
- django session过期设置
- 2022最全知识点——RF接口自动化框架项目实战
- 使用kon-boot绕过win10或其他版本密码
- linux解压文件卡住,linux停解压文件
- 使用Flash地图控件AnyMap创建Dashboard Drilldown Maps
- Java基础知识和进阶
- OA多级审批流程表设计方案(干货满满)
- Android 简单直接--无需jar包zing实现生成、扫描二维码
- gazebo实现小车巡线
- R语言List列表和向量Vector互相转化源码和思路
热门文章
- Java数据库篇8——索引、视图、存储过程、触发器
- 07 - java 方法里面的 return
- 底层实现_Java AOP的底层实现原理
- oracle执行计划的概念,SQL语句性能调整之ORACLE的执行计划
- 单链表的代码python_python版本单链表实现代码
- c++代码根据点位连线_邹军:数控车倒角C与自动倒圆角R编程方法
- 计算机科学陈国华,科学网—模式识别与智能系统是个什么专业? - 晏燕华的博文...
- 基础练习 FJ的字符串 递推 C++
- HTML+CSS+JS实现 ❤️CSS3图片遮罩高亮显示❤️
- mysql触发器如何获取当前表名_MCGS pro组态环境下,如何获取当前用户名,在画面上显示?...