5.类和对象(下)
接下来写一下流提取
提取的值放入所以不加const,另外istream ostreanm必须传引用,传值会报错,流对象不支持拷贝,
这一个printf 下面cout cout刷新缓冲区时候会先把printf缓冲区先刷新,写一个printf cout混着写,不会乱,兼容c,但会牺牲效率,可以指定不去刷新printf
false就是关掉这个同步,cin和cout也是绑在啊一起的,
cout也是带缓冲区的,刷新缓冲区是有要求的,换行符或者主动要求刷新,或者程序结束等等,所以这个请依次。。。不会到控制台只会到缓冲区,进行流提取会把cout主动刷新,也是因为他们默认绑在一起
6月31有一个非法日期
我们的对象可能有const对象,const对象调用函数的时候是有一定限制的,比如说用const调用Print
这里涉及权限放大问题,
其实第二个也有个const是修饰指针本身
这里Date*给Date*权限没有变化,这是修饰指针本身,不用管,不涉及权限放大缩小,修饰对象本身不会有问题
这就是权限放大了,所以在前面加个const
那这里怎么改变this指针类型,没办法加,类里函数里可以用,但实参形参不能写所以
如果成员函数后面没加const就是Date*加了const就是 const Date*
加了const里面就不能修改,加了const本质就变成,this指针不能修改,这个const是本来就带的
声明定义保持一致
如果这个对象是非const能不能调用可以,权限可以缩小
成员函数加上const有好处,普通股对象和const对象都可以调用了那可不可以把所有成员函数都加上,构造函数不能加const,加上没法修改,不修改的建议加上const
+,就可以加const +=不行 。
并且建议加const,可以避免把=写成==这个是this自带的
一般不需要写,系统库自动就支持了,取地址运算符不需要重载,他是默认成员函数,实际上默认生成就够用。为什么写两个,普通对象返回Date*,const对象返回constDate*
上面参数是Date* 下面const Date*构成函数重载,编译器调用去调用最匹配的
如果只写了这个普通对象和const对象都调用这个,但是有罪匹配的,为什么不调用最匹配的,编译器很聪明
这样故意给两个地址,以为访问到了,实际没,使坏这样。
先由2构造一个临时对象,再去拷贝构造他,因为隐式类型转换,类型转换产生临时变量
直接调用构造,把拷贝构造优化掉了
raa1能直接引用aa2,但不能直接引用2,并不是因为类型不同。因为中产生类型转换有临时变量具有常性,加const就可以 这时候怎么没有合二为一,这中间生成临时对象,引用临时对象,没有拷贝这有什么意义:
class Stack
{
public:void Push(const A& aa){//...}
private:A _arr[10];int _top;
};
有什么作用
这里定义了一个栈,栈里存的A类型,在这实现一个栈,栈内要插入数据,插入aa类型
正常这么写aa3,那我可不可以push(3)
效果一样的,报错因为没提供默认构造因为这有自定义类型,默认生成的要调用A的构造
愿意写下面那个,不愿写上面,我要定义一个有名对象再插入,那多不爽
这我构造一个有名对象,他变成有名对象的引用,下面的会自动生成一个临时对象,用A构造一个临时对象,这多便捷,临时对象具有常兴,所以加 const
只有单参数才能这么写,多参数默认是不支持的
本质是内置类型转换成自定义类型,多参数不支持多参可以这样
也就可以这样
这样也可以加上关键字explicit可以防止转换发生,多参数也一样,加上就不支持了。