C++指针、this指针、静态成员

一、C++ this指针

this指针指向调用的对象本身,在成员函数中,都会有一个默认的参数this。这点如果学过Python的话,可能会知道,在Python中每一个成员函数都会一个参数self,这里的this就是差不多的东西。其实具体来说,this指针也是指针,它存储的也是一个地址。当我们用一个对象去调用一个成员函数时,我们会把该对象的地址传给该函数,这也就是在函数中的this参数。因此this指针中存储的是调用对象的地址。
下面来看一个简单的例子:

#include <iostream>
using namespace std;class Line
{public:int getL();void setL(int l);void printL();Line();~Line();private:int len;
};Line::Line()
{cout << "创建对象" << endl;
}Line::~Line()
{cout << "释放内存" << endl;
}void Line::setL(int l = 3)
{this->len = l;
}int Line::getL()
{return this->len;
}void Line::printL()
{int temp;temp = this->getL();cout << "Len is:" << temp << endl;
}int main()
{Line line,line2;line.setL(10);line2.setL();line.printL();line2.printL();return 0;
}

在编程的过程中会发现许多问题,在用指针来得到结构体或者类的成员时我们不能使用’.'运算符来,需要使用->来访问才不会报错。其次,对于一个成员函数如何要使用参数的默认值,在类中定义时,不需要给出默认的函数参数。不然也会报错。
运行结果:

创建对象
创建对象
Len is:10
Len is:3
释放内存
释放内存

刚才看到使用printL()函数利用this指针来调用成员函数和成员变量。还有另外的一种方式来实现同样的操作,那就是友元函数。友元函数不属于类,但可以访问类的所有成员,包括私有成员和保护成员。与成员函数不同的是它没有this指针,它不属于类。

#include <iostream>
using namespace std;class Line
{public:friend void friend_test(Line line);int getL();void setL(int l);void printL();       Line();~Line();private:int len;
};Line::Line()
{cout << "创建对象" << endl;
}Line::~Line()
{cout << "释放内存" << endl;
}void Line::setL(int l = 3)
{this->len = l;
}int Line::getL()
{return this->len;
}void Line::printL()
{int temp;temp = this->getL();cout << "Len is:" << temp << endl;
}void friend_test(Line line)
{cout << "Len is :"<< line.len << endl;
}int main()
{Line line,line2;line.setL(10);line2.setL();line.printL();line2.printL();friend_test(line);friend_test(line2);return 0;
}

运行结果:

创建对象
创建对象
Len is:10
Len is:3
Len is :10
释放内存
Len is :3
释放内存
释放内存
释放内存

可以看出,在友元函数中可以直接访问私有变量。

二、类的指针

类的指针同普通变量的指针一样存储对象在内存中的地址。就像上面的this指针一样。
看一个小例子:

#include <iostream>
using namespace std;class Line
{public:int getL();void setL(int l);Line();~Line();private:int len;
};Line::Line()
{cout << "创建对象" << endl;
}Line::~Line()
{cout << "释放内存" << endl;
}void Line::setL(int l = 3)
{this->len = l;
}int Line::getL()
{return this->len;
}int main()
{Line line,line2;Line *p,*q;p = &line;q = &line2;p->setL(10);q->setL();cout << "line Len is: " << p->getL() << endl;cout << "line2 Len is:" << q->getL() << endl;return 0;
}

运行结果:

创建对象
创建对象
line Len is: 10
line2 Len is:3
释放内存
释放内存

需要注意的是,类的指针访问类的成员时需要使用->这个运算符。

三、类的静态成员

类中的静态的成员,意思是该类的所有对象共用这一个变量,不会随着对象的创建而被拷贝。讲到通俗一点就是,用static修饰的变量的地址已经锁定了,不可以更改。
静态成员的用法,当静态成员被定义时需要进行初始化。如果没有初始化,那么当该类创建第一个对象时,会自动为所有的静态成员变量进行初始化,值为0;并且在类中定义的静态变量不可以在类中定义时就对其初始化。可以使用:类型 类名::变量名 = 0这种形式来进行初始化。

#include <iostream>
using namespace std;class Line
{public:static int count;int getL();void setL(int l);Line();~Line();private:int len;
};int Line::count = 0;Line::Line()
{cout << "创建对象" << endl;count++;
}Line::~Line()
{cout << "释放内存" << endl;count--;
}void Line::setL(int l = 3)
{this->len = l;
}int Line::getL()
{return this->len;
}int main()
{Line line;cout << "已将创建的对象有:"<< line.count << " 个" <<endl;Line lines[3];cout << "已将创建的对象有:"<< line.count << " 个" <<endl; return 0;
}

运行结果:

创建对象
已将创建的对象有:1 个
创建对象
创建对象
创建对象
已将创建的对象有:4 个
释放内存
释放内存
释放内存
释放内存

C++指针、this指针、静态成员相关推荐

  1. c c++ 函数内数组初值_C/C++函数指针与指针函数

    关于指针,前面文章C语言指针详解有过介绍,这里主要讨论函数指针和指针函数. 1 什么是指针? 定义:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量; 上面一个 4GB 的内存可以存放 ...

  2. C++中引用,指针,指针的引用,指针的指针

    定义一个指针的三种写法都对:1. int * p;  2. int* p;  3. int *p; 习惯不同而已 定义一个函数指针的三种写法都对:1. int *p(); 2. int * p();  ...

  3. C++ 笔记(27)— 指针变量、数组和指针、指针数组、数组指针、指针常量与常量指针

    1. 什么是指针变量? 指针变量是专门有一个变量来存放指针. int main(int argc, char *argv[]) {int a = 10;int *p = &a; //通过取地址 ...

  4. 关于C语言中的数组指针、指针数组以及二级指针

    概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...

  5. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  6. Go 学习笔记(13)— 指针定义、指针特点、空指针、指针数组、指向指针的指针、指针作为函数入参

    1. 复合数据类型 Go 语言基本的复合数据类型有指针.数组.切片.字典.通道.结构和接口等.格式如下: * pointerType // 指针类型, [n]elementType // 数组类型, ...

  7. inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载

    嵌入式Linux:C++ 面试准备珍藏版本​zhuanlan.zhihu.com 明月照我心:123道c++笔试题汇总(含答案)​zhuanlan.zhihu.com 阿贵:常见C++笔试面试题整理​ ...

  8. C指针8:二级指针(意思就是指向指针的指针)

    指针可以指向一份普通类型的数据,例如 int.double.char 等,以下简称一级指针: 也可以指向一份指针类型的数据,例如 int *.double *.char * 等.以下简称二级指针:即如 ...

  9. C/C++指向指针的指针

    我在一篇教程中看到下面这段,它描述指向指针的指针是如何运作的. 引用文章相关段落如下: int i = 5, j = 6, k = 7; int *ip1 = &i, *ip2 = & ...

  10. 常引用、常量指针、指针常量、指向常量的常指针、空指针与野指针解释

    1.一.基础知识 引用并非对象 引用必须初始化 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 类型要严格匹配 int &a = 10; //错误:引用类型的初始值必须是 ...

最新文章

  1. 【字符串】manacher算法
  2. Nutch URL过滤配置规则
  3. 剑指offerpython_《剑指offer》3. 从尾到头打印单链表值【Java+Python】
  4. Quest Recovery Manager for Active Directory的使用(一)
  5. Python实现小球游戏
  6. 《模式识别原理及工程应用》——第2章 基于贝叶斯决策理论的分类器 2.1 分类器的描述方法...
  7. 重新认识一个强大的 Gson
  8. python批量创建实例_Django批量创建Model实例
  9. 查看EXE/DLL文件是32/64位之通用方法
  10. mb是做1还是0_新手爸妈看过来:0-1岁宝宝这样做早教,省钱省心又实用
  11. 学习文档【超详细中文版】(小甲鱼视频)
  12. Body-parser
  13. 不要在学习启动管理器和元编程上浪费时间
  14. mongodb重置密码
  15. 安装ruby-2.3.1
  16. 错误解决:Problem binding to [0.0.0.0:10033] java.net.BindException
  17. mt4下载正版官网下载(如何分辨真假MT4软件)
  18. DY-Tiva-PB 资料 电路图
  19. 机器人陈菁_党建铸造梦想,科创引领未来—2020年玉林市中小学机器人创客竞赛活动圆满成功...
  20. Winscp无法连接SFTP服务器

热门文章

  1. 作者:刘剑(1979-),男,中国联合网络通信集团有限公司信息化事业部项目一处工程师...
  2. 【程序设计】前置检测循环和后置检测循环
  3. 【操作系统】进程の易错点解答
  4. 【Java】辨析JUnit4中的@AfterClass、@BeforeClass、@after、@before
  5. 需求分析——掌握UML建模语言的用例图
  6. Sping(一)——IOC/DI
  7. mybatis使用in语句作为查询条件
  8. GridView去掉边框
  9. 翻译 《Why Indy?》计划进度表
  10. 作为一名程序员,我一直为中国的软件产业感到苦恼。