C++入门小知识(二)const修饰成员函数,内联函数,有元,静态成员的理解

xiaoxiao2021-02-28  11

c++入门小知识总结(二)

const修饰的成员函数

如果学过C语言,那么对const有一定的了解,const修饰的变量不能能够被改变,修饰指针呢,指针不能被改变等。。。 在C++中const修饰的成员函数,那么可以推测一下,是不是它所修饰的成员函数不能改变呢?答案是no 不是说它所修饰的成员函数不能被改变,而是它所要接受的对象在本函数中不能不改变。 怎么来修饰成员函数呢? 举个例子:

class Date { public: void Print()const // 这就是const修饰的成员函数 { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; };

用const修饰的成员函数在传对象的时候可以传非const修饰的对象,也可以传被const修饰的对象。 如果被const修饰的对象,就不能传给没有被const修饰的成员函数。 在这里总结,被const修饰的权限小,而没修饰的权限大,记住权限只能缩小,不能放大。在传参的过程中。

内联函数

关键字inline 被inline修饰的函数叫内敛函数。内敛函数一般在编译的时候会将函数展开,美誉压栈的开销,是一种空间换时间的做法,提高了代码的运行速率,但代码量加大。 这里有三点需要注意:

在对函数进行修饰为inline时,这时只是对编译器的一个建议,编译器可以采用,也可以不采用。如果定义的内敛函数出现在循环递归等重复性比较高的时候,编译器会自动优化,把inline函数变成一般函数。inline必须和函数定义放在一块才能生效,如果和声明放在一块是不会有作用。如果在定义函数时放在类里面定义,那么系统会自动的默认为内敛函数,但是具体是否被当作内敛函数所执行,那就看编译器是如何优化的。

关于内敛函数的用途我们还可以想到#define宏函数。它也是一种空间换时间的做法。但是两者又有很多差异。 我们来分析一下它们的优缺点: 优点: 内敛函数:提高了代码的运行效率。代码可以进行调试。有了类型的检查。 宏:提高了代码的运行效率,可以代替单个变量。 缺点: 内敛函数:不能代替单个变量,受到编译器的限制 宏:不方便调试,代码可读性差,维护性差,容易误用,没有类型检查。

友元

友元函数 友元函数说明:友元函数在类外允许访问类中的任何成员。关键字friend 注意两点:

友元函数不是类的成员函数,所以不能通过类来访问友元函数。友元函数可以通过对象访问所有成员,包括私有的和保护的。

友元函数使用声明友元函数必须在类的public并且需要加上friend关键字。 函数定义处不用添加关键字friend 例如:

class Date { public: friend void Print(); private: int _year; int _month; int _day; }; void Print() { cout << _year << "-" << _month << "-" << _day << endl; }

上面的void Print()函数就是一个友元函数。 在类外面定义的函数,是Date类的友元函数,那么类外的函数就可以直接访问类里面的成员变量,不管是受到保护的还是私有的。 友元类 一个类可以成为另一个类的友元类,那么这个类的所有成员函数都是另一个类的友元函数。 我们来举个例子:

class Date { private: int _year; int _month; int _day; }; class Time { public: friend class Date; private: int _hour; int _minute; int _second; };

这里的Date类就是Time;类的友元类,Date的所有成员函数都是Time类的友元函数。 在面向对象编程中有三大特性:封装, 继承, 多态。 但是友元破环了封装性,所以尽量少用。

静态成员

类的静态成员变量 静态成员关键字static 在所需要定义的变量或者函数前面加上关键字。 静态成员变量是该类的所有对象的共享成员变量。所以在类中初始化静态成员变量时,不能在构造函数中初始化静态成员变量。 例如:

class Date { private: int _year; int _month; static int _count; int _day; }; // 静态变量的初始化 int Date::_count = 0;

静态成员函数 静态成员函数也是所有对象共享的。 要注意的是静态成员函数没有隐含的this指针,所以在调用静态成员函数时,直接用类名加域符号和静态成员函数。 比如:

ass Date { public: static void Print() { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; }; int main() { // 静态成员函数的调用 Date::Print(); return 0; }

这里还有两点 静态成员函数不可以访非静态成员(没有this指针) 非静态成员函数可以访问静态成员

转载请注明原文地址: https://www.6miu.com/read-1650086.html

最新回复(0)