1. 实现String类
已知类String的原型为:
class String
{
public:
String(const char *str = NULL); //普通构造函数
String(const String &); //拷贝构造函数
~String(void); //析构函数
String & operator = (const String &); //赋值构造函数
private:
char * m_data; //用于保存字符串
};
请编写String的上述4个函数。
2. 将一个字符串逆序输出。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//for malloc
int main(){
char s[20]="Hello world!";
int n=strlen(s);
char *p=(char*)malloc((n+1)*sizeof(char));
char *a, *b;
a=p;
b=&s[n-1];
while(n-1>=0){
*a++=*b--;
n--;
}
*a='\n';
printf(p);
free(p);
return 0;
}
3.关于sizeof(),strlen()
char s[20]="Hello world!"
char *p="12345";
sizeof(s) //20
strlen(s) //12,不包括结尾的‘\0’
sizeof(s[0]) //1 s[0]==‘H’
sizeof(p) //8 p 是一个char*
sizeof(*p) //1 *p='H'
strlen(p) //5
这里首先要弄清楚各个数据类型的长度。sizeof()函数返回的是值的单位是字节。
各个类型的变量长度由编译器来决定(实际上与操作系统位数和编译器都有关)使用时可用sizeof()得到,当前主流编译器一般是32位或64位。
类型 32位 64位
char 1 1
short int 2 2
int 4 4
long int 4 8
long long int 8 8
char* 4 8
float 4 4
double 8 8
4. 关于i++和++i
int i=1;
printf("%d %d %d %d",i++,++i,i++,++i);//返回值为4 5 2 5。
这里需要弄清楚两点:1)首先参数列表从右向左计算各个表达式的值;2)++i返回的是一个引用(增1后的i的引用),而i++返回的是i本身
首先从右向左计算:
++i 返回i的引用,此时i==2
i++ 返回i本身,返回i==2 之后i+1
++i 返回i的引用,此时i==4
i++ 返回i本身,返回i==4 之后i+1
然后依次将这些参数的返回值压入栈,++i的返回值为i的引用,注意此时i==5,所以将5压入栈中, 然后i++ 返回2, ++i返回5, i++返回4, 然后依次出栈, 4,5,2,5
*****注意以上分析仅仅是基于VS来将的,对于不同的编译器可能会有不同的结果。
5. 关于c和c++中的const的区别
同样一段代码,在c编译器下,打印结果为*pa = 4, 4
在c++编译下打印的结果为 *pa = 4, 8
原因可以参考 2.1 题的解释。
int main(void)
{
const int a = 8;
int *pa = (int *)&a;
*pa = 4;
printf("*pa = %d, a = %d", *pa, a);
return 0;
}
另外值得一说的是,由于c++中const常量的值在编译期就已经决定,下面的做法是OK的,但是c中是编译通不过的。
int main(void)
{
const int a = 8;
const int b = 2;
int array[a+b] = {0};
return 0;
}