1. 类的定义
class String
{
private:
char *data;//字符串
size_t length;
public:
String(const char *str = NULL);//通用构造函数
String(const String &str);//拷贝构造函数
~ String();
size_t size() const;
const char* c_str() const;
};
/* 通用构造函数的实现 */
String:: String(const char *str){
if(!str){
length = 0;
data = new char [1];
*data = '\0';
}
if(str){
length = strlen(str);
data = new char[length+1];//深拷贝,申请内存
stpcpy(data,str);
}
}
/* 拷贝构造函数 */
String::String(const String &str){//为什么需要用&str 不能用str?(联想值传递与引用传递区别)
length = str.size();
data = new char[length + 1];//不加这个就是浅拷贝了,深拷贝:每个指针指向单独的内存。
strcpy(data,str.data);
printf("调用了拷贝构造函数\n");
}
/* 析构函数的实现 */
String::~ String( )
{
delete []data;
length = 0;
printf("调用了析构函数\n");
}
/* 获取字符串长度 */
size_t String::size() const {
return length;
}
/* 获取字符串 */
const char* String::c_str() const{
return data;
}
2.1 测试代码
/* 测试通用构造函数 */
void test_09_01(){
char a[] = "hello";
char *b = NULL;
char c[] = "world";
String str1(a);
String str2(b);
String *str3;
str3 = new String(c);
String str4("hello world");
printf ("str1.size() = %d\n",str1.size());
printf ("str1.c_str() = %s\n",str1.c_str());
printf ("str2.size() = %d\n",str2.size());
printf ("str2.c_str() = %s\n",str2.c_str());
printf ("str3.size() = %d\n",str3->size());//指针,需要用“->” 访问成员;
printf ("str3.c_str() = %s\n",str3->c_str());
printf ("str4.size() = %d\n",str4.size());
printf ("str4.c_str() = %s\n",str4.c_str());
delete str3;
str3 = NULL;
}
2.1 执行结果
3.1 测试代码
/* 测试拷贝构造函数 */
void test_09_02(){
char a[] = "hello world";
String str1(a);
String str2(str1);
printf ("str1.size() = %d\n",str1.size());
printf ("str1.c_str() = %s\n",str1.c_str());
printf ("str2.size() = %d\n",str2.size());
printf ("str2.c_str() = %s\n",str2.c_str());
}
3.2 执行结果