1,const char *转换为char *就是首先申请一段空间,然后复制进去,不能直接赋值是因为const
const char *pp="aaa";
char *p=new char[enoughspace];
strcpy(p,pp);
2,char *转换为const char*可以直接赋值
3,char *转为string
char *a="aaa”;
string s(a);
4,string转为const char *
string s="abc";
const char *c;
c=s.c_str();
5,const char *转string
const char *c="abc";
string s(c);
6,string转char *
string s="abc";
char *c;
const int len=s.length();
s=new char[len+1];
strcpy(c,s.c_str());
12. 下面的数据声明都代表什么意思?
(1)float(**def)[10]
Def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float。
(2)double*(*gh)[10]
Gh是一个指针,它指向一个一维数组,该数组元素都是double*
(3)double(*f[10])()
F是一个数组,f有十个元素,元素都是函数的指针,指向的函数类型是没有参数且返回double的函数
(4)int*((*b)[10])
就跟“int*(b)[10]”是一样的,b是一维数组的指针
(5)long(*fun)(int)
函数指针
(6)int(*(*f)(int,int))(int)
F是一个函数的指针,指向的函数的类型是有两个int参数并且返回一个函数指针的函数,返回的函数指针指向一个int参数且返回int的函数。
13. 指针数组与数组指针
指针数组,是指一个数组里面装着指针,数组指针,代表它是指针,指向真个数组
一个指向整型数组的指针定义为()
A.int(*ptr)[] B.int *ptr[] C.int*(ptr[]) D.int ptr[]
int(*ptr)[]是以一个指向整型数组的指针
int *ptr[]是指针数组,ptr[]里面存的的是地址。它指向位置的值就是*ptr[0],*ptr[1],*ptr[2],不要存*ptr[0]=5,*ptr[1]=6,因为里面没有相应的地址
int*(ptr[])与B相同
14. 用变量a给出下面的定义
(1)一个整型数 Itna;
(2)一个指向整形数的指针 int *a;
(3)一个指向指针的指针,它指向的指针是一个整型数 int **a;
(4)一个有10个整型数的数组 int a[10];
(5)一个有10个指针的数组,该指针是指向一个整型数的 int *a[10];
(6)一个指向有10个整型数组的指针 int (*a)[10];
(7)一个指向函数的指针,该函数有一个整型参数并返回一个整型数 int(*a)(int);
(8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整数 int (*a[10])(int)
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
5. 父类和子类各自定义一个成员函数,函数名相同,参数表不同,那么 C 。 函数同名,通通覆盖,不同层次的函数不能重载
A. 在子类中这两个函数构成重载关系
B. 子类不会继承父类的这个函数
C. 子类中的函数会覆盖父类中的函数
D. 编译时会发生错误
6. 如果myclass类定义了拷贝构造函数和一个整型参数的构造函数,还重载了赋值运算符,那么语句
myclass obj = 100;会 B 。等价于myclass obj = myclass(100)
A. 调用拷贝构造函数
B. 调用整型参数的构造函数
C. 调用赋值运算符
D. 引起编译错误
10. 如果有如下语句
char str[20];
cin >> str;
cout << str;
执行时输入的是“this is a test line!”,则输出的内容是 D 。
A. this is a test line!
B. this is a test line
C. this is a test
D. this
11. 执行语句
char ch[] = "Hello";
char * p = &ch[0];
cout << p;
结果是输出 C 。
A. 一个地址
B. H
C. Hello
D. 乱码
常量只能初始化,不能复制,所以将成员变量的常量应该放在构造函数中。
- 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
- 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
- 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化
成员变量的初始化顺序
- 成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的
初始化顺序
- 构造函数初始化列表的变量优先于构造函数(至少明显的写在前面) (若都在初始化列表中初始化,则按声明顺序初始化,与初始化列表中的顺序无关)
- 静态成员变量先于实例变量
- 父类成员变量先于子类成员变量
- 父类构造函数先于子类构造函数