C++静态成员函数和this指针详解

目录
  • 静态成员
    • 1.静态成员变量
    • 2.静态成员函数
  • 成员变量和成员函数分开存储
  • this 指针
  • 空指针访问成员函数
  • 总结

静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员

静态成员分为:

1.静态成员变量

 所有对象共享同一份数据
 在编译阶段分配内存
 类内声明,类外初始化

示例:

#include<iostream>
using namespace std;
class Person
{
public:
   static int m; // 所有对象共享同一份数据
};
int Person::m = 0;// 类内声明,类外初始化

2.静态成员函数

所有对象共享一个函数
静态成员函数只能访问静态成员变量
#include<iostream>
using namespace std;
class Person
{
public:
   static void func()
   {
   	cout << "static void func调用" << endl;
   	m_a = 100;//静态成员函数可以访问静态成员变量
   	//m_b=100,静态成员函数不可以访问非静态成员变量
   	//原因无法区分到底哪个是对象的m_b;
   }
   static int m_a;//静态成员变量
   int m_b;
};
int Person::m_a = 0;
int main()
{
   //1.通过对象访问
   Person p;
   p.func();
   //2.通过类名访问
   Person::func();

   system("pause");
   return 0;
}

静态成员函数可以访问静态成员变量

静态成员函数不可以访问非静态成员变量

私有权限的静态成员函数,也是访问不到的

成员变量和成员函数分开存储

在C++中,类内的成员变量和成员函数分开存储

只有非静态成员变量才属于类的对象上

空对象:

#include<iostream>
using namespace std;
class Person
{

};
void test01()
{
	Person p;
	//空对象占用内存空间为:1
	//C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
	//每个空对象也应该有独一无二的内存地址
	cout << sizeof(p) << endl;
}
int main()
{
	test01();
	return 0;
}

输出结果:1

#include<iostream>
using namespace std;
class Person
{
	int m_a;//非静态成员变量 属于类的对象上
};
void test02()
{
	Person p;
	cout << sizeof(p) << endl;
}
int main()
{
	test02();
}

输出结果:4

#include<iostream>
using namespace std;
class Person
{
	int m_a;//非静态成员变量 属于类的对象上
	static int m_b; //静态成员变量 不属于类的对象上
};
void test02()
{
	Person p;
	cout << sizeof(p) << endl;
}
int main()
{
	test02();
}

输出结果:4

与第二个对比可知:

静态成员变量 不属于类的对象上

#include<iostream>
using namespace std;
class Person
{
	int m_a;//非静态成员变量 属于类的对象上
	static int m_b; //静态成员变量 不属于类的对象上
	void func() {}//非静态成员函数 不属于类的对象上
	static void func2() {} //静态成员函数也不会属于 类的对象上
};
 int Person::m_b = 0;
void test02()
{
	Person p;
	cout << sizeof(p) << endl;
}
int main()
{
	test02();
}

输出结果:4

结论:只有非静态成员变量才属于类的对象上

this 指针

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码

那么问题是:这块代码是如何区分是哪个对象调用自己的呢?

C++通过提供的特殊的对象指针,this指针,解决上述问题,this 指针指向被调用的成员函数所属的对象,通俗的说,谁调用它,this就指向谁

this 指针是所有成员函数的隐含参数吗,不需要定义,可直接使用

this 指针的用途

1.当形参和成员变量同名时,可用this指针来区分
2.在类的非静态成员函数中返回对象本身,可用 return  *this

1.当形参和成员变量同名时,可用this指针来区分

#include<iostream>
using namespace std;
class Person
{
public:
	void func(int age)
	{
		this->age = age;  //
	}
	int age;
};
int main()
{
	Person p;
	p.func(18);
	cout << p.age << endl;
	system("pause");
	return 0;
}

2.在类的非静态成员函数中返回对象本身,可用 return *this

#include<iostream>
using namespace std;
class Person
{
public:
	Person& func(Person&p)
	{
		this->age += p.age;
		return *this;
	}
	int age;
};
int main()
{
	Person p;
	p.age = 10;
	//链式编程思想
	p.func(p).func(p).func(p);
	cout << p.age << endl;
	system("pause");
	return 0;
}

空指针访问成员函数

C++中空指针是可以调用成员函数,但是也要注意有没有用到this指针

如果用到this指针,需要加以判断保证代码的健壮性

#include<iostream>
using namespace std;
class Person
{
public:
	void ShowPersonclass()
	{
		cout << "调用ShowPerclass()函数" << endl;
	}
};
int main()
{
	Person* p = NULL;
	p->ShowPersonclass();
	system("pause");
	return 0;
}

通过空指针p是可以访问到成员函数(不带this指针的成员函数)

如下代码就是一个错误代码

#include<iostream>
using namespace std;
class Person
{
public:
	void ShowPersonname()
	{
		cout << m_name << endl;  //此处出现了this指针
	}
	int m_name;
};
int main()
{
	Person* p = NULL;
	p->ShowPersonname();
	system("pause");
	return 0;
}

解析:

此处出现了this指针

cout << m_name << endl;

相当于

cout <<this -> m_name << endl;

而this指针是一个空指针,所以会报错

为了增加代码的健壮性,我们因该做出如下改动

#include<iostream>
using namespace std;
class Person
{
public:
	void ShowPersonname()
	{
		if (this == NULL)  //在此判断this是否是空指针
			return;
		cout << m_name << endl;
	}
	int m_name;
};
int main()
{
	Person* p = NULL;
	p->ShowPersonname();
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++ 中this指针的用途详解

    目录 1.区分形参和变量同名时: 2.return *this返回函数本身 总结 先说结论: 1.形参和变量同名时,可用this指针来区分 2.在类的非静态成员函数中返回本身,可用return *this 1.区分形参和变量同名时: #include <iostream> using namespace std; class Person { public: Person(int age) { age = age; } int age; }; void test01() { Person p1

  • C++中静态成员函数访问非静态成员的实例

    C++中静态成员函数访问非静态成员的实例 实现代码: #include <iostream> /* 静态成员函数只能访问静态数据成员.静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可由任意访问许可的函数访问.原因是:当前对象的地址(this)是被隐含地传递到被调用的函数的.但一个静态成员函数没有this指针,所以它无法访问非静态的成员函数. */ class a { public: static void FunctionA()//静态成员函数没有隐含的

  • C++类的静态成员变量与静态成员函数详解

    目录 1.类的静态成员变量 2.静态成员函数 总结 1.类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成员变量属于全局区,不属于类的空间. 3.静态成员变量通过类名访问,也可以通过对象访问,同一类的不同对象,静态成员共享同一份数据 下面通过代码验证以上三种说法: #include <iostream> using namespace std; class Base{ public: static int va

  • 详解C++中的this指针与常对象

    C++ this指针详解 this 是C++中的一个关键字,也是一个常量指针,指向当前对象(具体说是当前对象的首地址).通过 this,可以访问当前对象的成员变量和成员函数. 所谓当前对象,就是正在使用的对象,例如对于stu.say();,stu 就是当前对象,系统正在访问 stu 的成员函数 say(). 假设 this 指向 stu 对象,那么下面的语句中,this 就和 pStu 的值相同: Student stu; //通过Student类来创建对象 Student *pStu = &s

  • 深度理解c++中的this指针

    1.this指针,就是一个指向当前对象的指针.我们知道,定义出一个类,它在内存中是不占空间的,只有定义了该类类型的对象时,系统就会为该对象分配一段存储空间,这段空间里只存储成员变量,对于成员函数,是存放在代码区的.(复习:内存分为5大区:静态区.常量区.栈.堆.代码区).下边给出一个日期类,通过这个实例,深度理解this指针. #define _CRT_SECURE_NO_WARNINGS 1 #include using namespace std; class Date { public:

  • C++的静态成员变量和静态成员函数详解

    目录 一.static修饰变量 二.static修饰函数 三.static在类中使用 1.创建与初始化 2.使用问题 3.在public.private下static变量使用 四.class含有static变量所占空间 五.练习题:求学生总人数.总分.平均分系统. 总结 static int a = 10;//在静态区分配空间,不在堆栈 在静态区分配空间,不在堆栈分配空间.因此,只有等到所以函数全部执行完成后,才会释放空间. 一.static修饰变量 void text() { static i

  • C++静态成员函数和this指针详解

    目录 静态成员 1.静态成员变量 2.静态成员函数 成员变量和成员函数分开存储 this 指针 空指针访问成员函数 总结 静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为: 1.静态成员变量 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 示例: #include<iostream> using namespace std; class Person { public: static int m; // 所有对象共享同一份数据 }

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

  • C++获取类的成员函数的函数指针详解及实例代码

    C++获取类的成员函数的函数指针详解 用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} //static member void nonstatic(){cout<<"nonstatic"<<endl;} //nonstatic member virtualvoid virtualmember(){cout<

  • C++函数指针详解

    函数指针基础: 1. 获取函数的地址 2. 声明一个函数指针 3.使用函数指针来调用函数 获取函数指针: 函数的地址就是函数名,要将函数作为参数进行传递,必须传递函数名. 声明函数指针 声明指针时,必须指定指针指向的数据类型,同样,声明指向函数的指针时,必须指定指针指向的函数类型,这意味着声明应当指定函数的返回类型以及函数的参数列表. 例如: double cal(int); // prototype double (*pf)(int); // 指针pf指向的函数, 输入参数为int,返回值为d

  • C++ 中的this指针详解及实例

    C++ this 指针详解 学习 C++ 的指针既简单又有趣.通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的. 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. this指针是类的一个自动生成.自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象. 全局仅有一个this指针,当一个对

  • C/C++静态类和this指针详解及实例代码

     C/C++静态类和this指针详解 1.静态类 C++的静态成员不仅可以通过对象来访问,还可以直接通过类名来访问. class CBook{ public: static double price;//需要通过类外来进行初始化 } int main(void){ CBook book; book.price;//通过对象来访问 CBook::price//通过类名来访问 return 0; } 静态成员变量 对应静态成员有以下几点需要注意: (1)静态数据成员可以是当前类的类型,而其他数据成员

  • C++类与对象深入之静态成员与友元及内部类详解

    目录 一:静态成员 1.1:静态成员分类 1.2:静态成员变量 1.3:静态成员函数 1.4:总结特性 1.5:试题示例 1.6:C++11成员初始化新玩法 二:友元 2.1:全局函数做友元 2.2:类做友元 2.3:成员函数做友元 三:内部类 3.1:概念 3.2:特性 一:静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员.C++里面尽量用静态成员变量代替全局变量. 1.1:静态成员分类 1️静态成员变量: 所有对象共享同一份数据 在编译阶段分配内存 类内声明,

  • C语言指针详解及用法示例

    新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处.下面我就带着问题来写下我对于指针的一些理解. 指针是什么? 指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值.它的定义如下: int a=10,*p; p=&a int a=10; int *p=&a; 首先我们可以理解 int* 这个是要定义一个指针p,然后因为这个指针存储的是地址所以要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a. 很多新手都会对这两种定义方法

  • C++ 静态成员的类内初始化详解及实例代码

    C++ 静态成员的类内初始化详解及实例代码 一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: //example.h #include<iostream> #include<vector> using namespace std; class Example{ public: static double rate = 6.5; static const int vecSi

  • C语言中qsort函数的用法实例详解

    C语言中qsort函数的用法实例详解 快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法. qsort函数包含在<stdlib.h>中 qsort函数声明如下: void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *)); 参数说明: base,要排序的数组 nmemb,数组中元素的数目 size,每个数组元素占用的内存空间,可使用si

随机推荐