本片博客是作者在学习c++的过程中的笔记记录,希望和各位读者一起学习交流
静态成员变量成员函数
- 静态成员变量
- 定义静态成员变量
关键字static可以用于说明一个类的成员,静态成员提供了一个同类对象的共享机制
把一个类的成员说明为static时,这个类无论有多少个对象被创建,这些对象共享这个static成员
静态成员属于类,它不是对象成员
用法:
- 使用静态成员变量
当静态成员变量是public属性的时候,可以使用类名或者对象来直接调用,类调用的时候时要用“::”来调用,对象调用的时候要用“.”来调用
当静态成员变量是private属性的时候,只能通过对象调用相应的成员函数来使用
- 定义静态成员变量
- 静态成员函数
- 概念
静态成员函数用关键字staic进行修饰
在类外调用静态成员函数的时候,用“类名::”做限定词或者通过对象进行调用 - 在静态成员函数中能使用静态成员变量,但是不能使用普通成员变量。
原因:如果在静态成员函数中使用普通变量的话,那样就不能确定这个普通变量属于哪个对象,因此会发生错误
- 概念
C++面向对象模型初探
- c++对象模型可以概括为两部分:
- 语言中直接支持面向对象程序设计的部分,主要涉及如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等。
- 对于各种支持的底层实现机制
在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。在c++中,通过抽象数据类型(abstract data type,ADT),在类中定义数据和函数,来实现数据和函数的绑定
概括的说,c++类中有两种成员数据:static、nonstatic;三种成员函数:static、nonstaitc、virtual
-
编译器对属性和方法的处理机制
c++类中的成员变量和成员函数是分开存储的-
成员变量:
普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式
静态成员函数:存储于全局数据区中 -
成员函数:
存储于代码段中 -
总结:
c++类对象中的成员变量和成员函数是分开存储的
c++中类的普通成员函数都隐式包含一个指向当前对象的this指针
静态成员函数不包括指向具体对象的指针,普通成员函数包括一个指向具体对象的指针
-
-
this指针
this指针是指向对象自己本身的一个指针
若方法的形参的名字和对象的属性的名字相同,则通过this指针来解决 -
const的修饰
eg:class Test{
public:
void ope(int a)const
{
;
}
private:
int m_a;
};
这里的const修饰的是this指针指向的内存空间,表示this指针指向的内存空间不能进行修改,this指针本省就是不可以进行修改的,因为this指针的类型是:Test * const ,说明this指针是一个常指针。 -
全局函数PK成员函数
- 全局函数转化成成员函数,通过this指针隐藏左操作数
Test add(Test &t1,Test &t2)===》》》 Test add(Test &t2) - 成员函数转换成全局函数,多一个参数
void print()===》》》void add(Test *pthis) - 函数返回元素和返回引用
函数返回引用是返回对象本身,即*this
Test &add(Test &t2);
返回返回元素是返回一个匿名对象
Test add(Test &t2);
- 全局函数转化成成员函数,通过this指针隐藏左操作数
友元函数、友元类
- 友元函数(破坏了类的封装性)
- 类中通过使用关键字friend 来修饰友元函数,但该函数并不是类的成员函数,其声明可以放在类的私有部分,也可放在共有部分。友元函数的定义在类体外实现,不需要加类限定
- 一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数
- 友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用
- 友元函数在调用上同一般函数一样,不必通过对对象进行引用
格式:
friend 类型 函数名(形式参数);
- 友元类
- 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)
- 当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类
格式:
friend class 类名;
下面的是笔者的微信公众号,欢迎关注,会持续更新c++、python、tensorflow、机器学习、深度学习等系列文章