1.为什么父类指针可以指向子类对象,而子类指针不能指向父类对象?
子类中包含从父类中继承过来的成员变量以及方法,因此父类指针指向子类对象时可以调用子类中所有从父类中继承的方法和对象;但是子类指针指向父类时,一旦访问子类特有的方法时或者成员变量时会出现非法,子类中有的方法为子类特有,父类并没有这些方法。
从内存的角度来看子类内存大于父类内存,因此父类指针指向子类对象时只会指向父类长度的内存,反过来用子类指针的话,内存长度大于父类对象,因此会导致内存溢出。
2.什么是类型兼容规则?
即在需要基类对象的任何地方都可以使用公有派生类对象进行替代。
几种替换的情况:
子类对象隐含转换为父类对象;子类对象用于初始化父类的引用;父类指针指向子类对象。
例:base =derived; Base &b = derived; Base *b = &derived;
3.关于内存分区的问题
堆区用于存储new分配的内存;栈区用于存储局部变量或者函数参数;*存储区存储malloc等分配的内存,也包括new;全局/静态存储区分为初始化与为初始化,c++中无区分,共用一块内存;常量存储区用来存常量,通常无法修改。
4.定义类成员时,成员数据不分配内存,不可赋初始值。
5.为什么char*s不能修改字符?
例:char*s=“today“;此时的today存在只读内存中,因此只能读不能写,例如
s[3]='c';则不行,因为对s进行了写的操作
char s[]="today";则可以,因为此时的s数组存放在栈区,可读可写。
另外char *s=new char[];s="today";s[3]='c';还是不行,因为此时s还是只读
6.文件的输入输出流的相关知识
setprecision(x):保留x个有效数字,而不是保留小数点后x位(要注意区分);
setw(x)为右对齐,不够的前面用空格补,若字符数比x长,则直接输出字符;
getline( char *buffer, streamsize num )
getline( char *buffer, streamsize num, char delim )
buffer用于存储要读取的字符数组,num为字符数组长度,值得一提的是假设读取的是150个字符,那么第150个为\n,因此要读取150个元素,num则为151,buffer的长度也应该大于150。delim为设定指定终止字符;
ios_base::app用于打开一个输出文件在文件尾添加数据;
ios_base::ate用于打开一个现存文件(输入或输出)并查找到结尾;
seekg和tellg,g是get的意思,用于保留指针,该指针指向下一个即将读取的数据的位置
seekg用于设置,tellg用于返回,返回值为streampos类型;
this和*this的区别
this为存放当前对象的地址,*this返回当前对象的拷贝或者本身,而this则是当前对象的地址。
STL中基本一些用法:
upper_bound返回第一个大于key的迭代器;
lower_bound返回第一个大于等于key的迭代器
equal_range返回一个pair对象,即upper_bound和lower_bound的值
什么是pair(对组),以及基本用法?
(3条消息) C++ pair的基本用法总结(整理)_sevenjoin的博客-****博客_c++ pair