[c++基础]运算符重载,共有数据保护,静态成员

来源:互联网 发布:淘宝店铺类型收费标准 编辑:程序博客网 时间:2024/06/05 05:03

1.    运算符重载



一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。

当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。



2.   共用数据的保护

(1)常对象(为了防止成员函数修改常对象中数据成员的值)

类名 const  对象名[(实参列表)]   或 const  类名  对象名[(实参列表)]

a. 定义常对象时,必须对数据成员进行赋值,如  const Time t(12,13,35);

b. 常对象不能调用非const型的成员函数(除了由系统自动调用的隐式的构造函数和析构函数);

c. 常对象只有调用const型成员函数才能访问数据成员,但此时仍然不能修改常对象中数据成员的值,如需修改将数据成员声明为mutable;

d.不要误认为常对象中的成员函数都是常成员函数,常对象只是保证数据成员是常数据成员,在常对象中的函数未加const编译器扔仍会把它作为非const成员函数

 

(2)常数据成员:

只能通过构造函数的参数初始化表进行初始化,任何其他函数都不能对常数据成员赋值

const inthour;

Time(inth) {hour= h;}  //错误

Time(inth):hour(h) {}  //正确

 

(3)常成员函数


常成员函数:它可以引用数据成员(不管const与否)只是不能改变变量值, 同时,常成员函数不能调用类中任何非const成员函数。因此,常成员函数的最重要作用就是限制对于const对象的使用。

非常成员函数:它可以引用数据成员(不管const与否),但是不可以引用const对象的数据成员。

3.  静态成员 

传送门

(1) 静态数据成员

要对静态数据成员初始化必须在类的外面也就是在全局作用域中定义,如果定义不给出初值,则默认初值为0


即使不定义对象,也为静态数据成员分配空间,它可以被引用,比如:cout<< Test::a;

定义了对象后也可以直接通过对象引用它,比如:Test  t;   cout<<  t.a;

 

(2)  静态成员函数

静态成员函数主要用来访问静态数据成员而不访问非静态数据成员

静态成员函数不能调用非静态成员函数,但是反过来是可以的。

静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字)


(3)static全局变量与普通的全局变量有什么区别? static局部变量和普通局部变量有什么区别static函数与普通函数有什么区别?

答:这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。

static函数与普通函数作用域不同。而且,static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。






0 0
原创粉丝点击