[ ]字符串也能作下标:




尽量不要在代码中写裸常量,可用宏定义,若是整型可以采用枚举类型(老标准的枚举类型中的修饰词可以被取出来当整数直接使用,即不通过定义一个变量来使用。
但枚举类型新标准中,得这样定义(限制与整数之间的通用,但若进行强制类型转换是可以的)
enum class 类型名称{ //必须写类型名称
xxx,
yy
};
使用时: 类型名称 变量名 = xxx;是不行的,要这么写 类型名称 变量名 = 类型名称::xxx;
也可以不通过定义一个变量,来直接使用内部的xxx, yy作为整数,但是不但要类型转换,还要加上类型名称: (int)类型名称::xxx;
)。
此外:
当然了在B的test方法内部实现中,定义shape的枚举类型也是可以的,需要这么定义:A::shape(类似于int) a;
不能这么定义:shape a;
重载<< 和 >>




此应用方式并不符合一般的编程习惯。




运行结果:

实际上,虽然该方法使用的是全局函数,但是为了封装效果,应该写入对应的类的类文件中。 (实现到类文件,声明到头文件)
重载>>



运行:

这里退出时会有错误提示:因为name变量是char*型,Boy类构造函数时,会根据输入的字符长度开辟新的空间。此时“老王”名字长度大于Rock的字符长度,所以出错。

一般来讲:char*a= "agfs"; a = "dgasgasg";这是可以的,但是cin或者scanf 对a 是不行的。
上面的函数能够cin >> boy.name是因为this->name指向的是堆空间,所以可以更改。这种情况下c的scanf_s也是可以的。
那么如何解决错误:








输出结果:


在boy类中进行实现:



运行结果:


//可以采用第二种方式(类类型==>普通类型)实现,但不是太妥当,可能引起歧义。



运行:

这里年龄错误是因为,age = boy[AGE];函数调用发生错误,为什么呢:
因为,Man的构造函数中,boy是常引用,对象是常量对象。下标重载函数的方法不是常量方法,所以不能调用。

将这两种方法加上const;定义之处也要加。重新实行:

浙公网安备 33010602011771号