const char*,char *和string之间的转换

const char *和char *,还有string之间的转换为:
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. 乱码


常量只能初始化,不能复制,所以将成员变量的常量应该放在构造函数中。


  • 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
  • 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
  • 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化

成员变量的初始化顺序

  • 成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的

初始化顺序

  • 构造函数初始化列表的变量优先于构造函数(至少明显的写在前面) (若都在初始化列表中初始化,则按声明顺序初始化,与初始化列表中的顺序无关)
  • 静态成员变量先于实例变量
  • 父类成员变量先于子类成员变量
  • 父类构造函数先于子类构造函数


你可能感兴趣的:(Cpp编程)