c++静态成员变量和静态成员函数:
-
类的静态成员有两种:静态成员变量和静态成员函数。静态成员变量本质上是全局变量,静态成员函数本质也是全局函数,
-
静态成员变量和静态成员函数都可以使用类名去调用。
非静态成员的访问方式(对象名.成员名),需要指明被访问的成员变量是属于哪个对象的,或者是调用的成员函数作用于哪个对象的。静态成员的访问方式(类名::成员),不需要指明被访问的成员是属于哪个对象的或是作用于哪个对象的。
两者的相同点:两者在定义的前面都有static关键字。
静态成员函数总结:
- 静态成员函数**只能**直接访问静态成员变量(函数),不能直接访问普通成员函数。
- 静态成员函数是类中的特殊成员函数,
- 静态成员函数**没有隐藏的this指针**:当调用一个对象的非静态成员函数时,系统会将该对象的起始地址赋给成员函数的this指针,静态函数不属于某一个对象所有,是该类的所有对象共享,所以静态成员函数没有隐藏的this指针。
静态成员变量总结:
-
特性:使用static修饰,在类外部初始化,使其分配空间。举个例子:
-
如果static成员变量使用const修饰,则可以直接在类内部初始化赋值。举个例子:
扩展:使用const加以限制的变量,不允许再次修改。
C++之const类成员函数,成员变量。又称常成员函数和常成员变量。
-
什么时候使用const常成员变量呢?在类中,如果你希望某些数据不被改变,就可以加关键字const来加以限定。const可以修饰成员变量和成员函数。
-
const成员函数(常成员函数):const成员函数可以使用类的所有成员变量,但是不能修改它们的值,仅仅只能获取值,这种措施主要是为了保护数据而设定的。
-
需要强调的是**const函数声明和定义需要同时在函数头部结尾处加上const关键字**。举个例子:
class Student{
public:
Student(char *name, int age, float score);
void show();
//声明常成员函数
char *getname() const;
int getage() const;
float getscore() const;
private:
char *m_name;
int m_age;
float m_score;
};
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }
void Student::show(){
cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}
//定义常成员函数
char * Student::getname() const{
return m_name;
}
int Student::getage() const{
return m_age;
}
float Student::getscore() const{
return m_score;
}
其中的getname()、getage()、getscore()三个函数的功能都很简单,仅仅只是获取成员变量的值,所以我们加了const限制。
最后来区分一下const的位置问题:
- 函数开头的 const 用来修饰函数的返回值,表示返回值是 const 类型,也就是不能被修改,例如
const char * getname()
。 - 函数头部的结尾加上 const 表示常成员函数,这种函数只能读取成员变量的值,而不能修改成员变量的值,例如
char * getname() const
。一、C++虚函数基础
纯虚函数:
含有纯虚函数的类叫抽象类,抽象类是绝对不能是生成对象的
但是。重点来了,,,
可以定义指向抽象类的指针或引用,此指针可以指向他的派生类,进而实现多态。
继承抽象类的派生类必须全部实现抽象类中的纯虚方法(可以不实现其他成员函数但是纯虚函数一定要派生类实现),否则,派生类也变成了抽象类。
纯虚函数也可以有函数体但必须是在类的外部,例如:
有函数体的纯虚函数仍然不能生成对象,但可以为派生类提供一个默认实现。
什么时候需要选用纯虚函数呢?
- 基类不需要实例化
- 子类基本都需要override重写父类的虚函数时
- 抽象类的析构函数必须是纯虚函数(在这里有个比较会被继承类的析构函数一定是虚析构,否则 会造成内存泄漏。因为在析构时先析构派生类再析构被继承的类)
二、C++中的多态
c++支持两种多态性
讲讲多态:c++支持两种多态性,编译时多态性(也叫静态多态),运行时多态性(也加动态多态)。编译时多态性:通过重载函数和运算符重载实现。运行时多态性:通过虚函数和继承实现。
C++实现多态的方式:
c++中实现多态的方式共有三种:1.函数重载(函数重载有参数重载、运算符重载),2.模板函数 3.虚函数
下面是虚函数与多态之间的猫腻:hhhhh 想深入了解的童鞋,戳戳下面的链接:[(https://blog.youkuaiyun.com/weixin_43072157/article/details/82223492)链接地址
下面是学习c++教程的连接:c++学习链接
三、C++中的引用&指针
-
先介绍一下引用:C++引用:引用实质可以看做是数据的一个别名。
引用的定义方式类似于指针,使用&取代了*,语法格式 type &name=data;引用在定义同时必须初始化。 -
指针&引用两者的区别:指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来
的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单
元。
(2)引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。
(3)可以有const指针,但是没有const引用;
(4)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(5)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(6)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(7)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;
(8)指针和引用的自增(++)运算意义不一样;
(9)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏
《本文中如果有纰漏、错误,欢迎各位仁兄在下方留言,希望我们一起学习,一起进步。》