explicit关键字&&static成员

网友投稿 682 2022-05-30

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

explicit关键字&&static成员

掘金LV3用户 https://juejin.cn/user/1381426159953960

阿里云社区专家博主,星级博主,技术博主 https://developer.aliyun.com/profile/expert/5lkdbuggiiuhc

华为云云享专家 https://bbs.huaweicloud.com/community/myhomepage

1.3 explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。

class Date { public: Date(int year) :_year(year) { cout << "Date(int yaer)" << endl; } Date(const Date& d) { _year = d._year; } //Date(int year) // :_year(year) //{} private: int _year; int _month; int _day; }; void TestDate() { Date d1(2018); // 用一个整形变量给日期类型对象赋值 Date d2 = 2019;//隐式类型转换 } int main() { TestDate(); }

本来日期类和整形没有任何关系,但是支持单参数的构造函数之后,整形就可以构造一个日期类的对象

int main() { //虽然它们都是直接构造,但是过程不一样 Date d1(2022); Date d2 = 2022;//隐式类型转化 //这里是用2022构造一个临时对象Date(2022),再用这个对象拷贝构造d2, //但是C++编译器会在连续的一个过程中,多个构造会被优化,合二为一 //所以这里被优化为直接就是一个构造 //隐式类型转化 - 相近类型 - 表示意义相似的类型 double d = 1.1; int i = d; const int& x = d; //不同类型的引用要加const //强制类型转化 - 无关类型 int* p = &i int j = (int)p; }

上述代码可读性不是很好,用explicit修饰构造函数,将会禁止单参构造函数的隐式转换。

explicit Date(int year) :_year(year) {}

2.static成员

2.1 概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的 成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化

面试题:实现一个类,计算中程序中创建出了多少个类对象。

class A { public: //构造函数 A() {++_scount;} //拷贝构造函数 A(const A& t) {++_scount;} //提供函数接口获取数值 //静态成员函数 static int GetACount() { return _scount;} private: static int _scount;//静态成员变量 }; //静态成员变量要在类外面初始化 int A::_scount = 0; void TestA() { cout<

静态成员变量属于整个类,所有对象,生命周期在整个程序运行期间

在类外面的访问方式:前提:_scount是公有的

cout << A::_scount<

_scount是私有的 ->提供成员函数

静态成员函数:没有this指针,只能访问静态成员变量

static int GetACount() { return _scount;}

特性

静态成员为所有类对象所共享,不属于某个具体的实例

静态成员变量必须在类外定义,定义时不添加static关键字

类静态成员即可用类::静态成员或者对象.静态成员来访问

静态成员函数没有隐藏的this指针,不能访问任何非静态成员

静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

静态成员函数可以调用非静态成员函数吗? ->不可以,因为静态成员函数没有this指针!

非静态成员函数可以调用类的静态成员函数吗? ->可以

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:linux 监控网络IO、磁盘、CPU、内存
下一篇:代码重构:被拒绝的遗赠(Refused Bequest)
相关文章