本部分罗列了本章的难点或注意点,以便复习巩固或者回忆,关注私聊我可以免费领取pdf版C++ Primer Plus 第6版。
-
不能重载的运算符有:sizeof . *(指针) :: ?: typeid const_cast dynamic_cast reinterpret_cast static_cast
-
只能通过成员函数重载: = () [] ->
-
友元有三种:友元函数、友元类、友元成员函数
-
友元函数在类声明中声明,但不是成员函数,不能用成员运算符调用,但它与成员函数的访问权限相同。不用使用类限定符:: 定义时不能使用关键字friend
-
<<必须用友元函数,应为默认第一个操作数为ostream对象
-
重载运算符要注意二义性错误
-
矢量类中涉及类的多种表达方式的转换
-
time(0)返回当前时间 ,用来设置种子 srand(time(0))覆盖默认的种子值 rand()是一个伪随机数,用一个初始种子生成一个随机数,每次生成的随机数当做下一次的种子
-
只接受一个参数的构造函数能作为转换函数
stonewt mycat; mycat = 19.6; //mycat = stonewt(19.6);
-
explicit用于关闭这种隐式转换
explicit stonewt(double);
-
stonewt jumbo(7000); //uses stonewt(double) ,converting int to double jumbo = 7000;//uses stonewt(double) ,converting int to double
-
注意二义性
stonewt(double); stonewt(long); stonewt jumbo(7000); //invalid
-
转换函数:用于进行相反的转换使用的运算符函数
stonewt wolfe(285.7); double a = double(wolfe); //valid double b = (double)wolfe; //valid double c = wolfe; // valid implicit
-
转换函数必须是类方法、不能指定返回类型、不能有参数 operator typeName ();
-
隐式转换主义二义性 。
operator double(); stonewt a; cout << a; //valid output double operator double(); operator int(); stonewt a; cout << a; //invalid ?int double
-
c++11中 可以将转换运算符声明为显示的 explicit operator double() const;
-
类型转换分为:只有一个参数的类构造函数用于将类型与该参数相同的值转换成类类型;被称为转换函数的特殊类成员运算符函数,用于将类对象转换成其他类型
-
将加法定义为友元可以让程序更容易适应自动类型转换
-
为了保险,可以使用显示转换。