• 第十八章 31用复制构造函数实现字符串的初始化 简单


    //31用复制构造函数实现字符串的初始化
    /*
    #include <iostream>
    using namespace std;
    class String
    {
    public:
    	String(); //默认的构造函数
    	String(const char*const ch); //构造带值的string
    	int getlen()const { return len;}   //读取长度
    	const char *getstr()const{ return str;} //读取字符串
    
    
    	//这里是可以修改的
    	char &operator[](unsigned short int  length);
    	char  operator[](unsigned short int  length)const;
    
    	//复制构造函数
    	String (const String&r);
    
    private:
    	unsigned short int len;
    	char *str;
    };
    //创建一个空的str变量
    String::String()
    {
        len = 0;
    	str = new char[1];
    	str[0] = '\0';
    };
    String::String(const char*const ch)
    {
    	cout<<"带一个参数的构造函数"<<endl;
    	len = strlen(ch);
    	str = new char[len+1];
    	for(int i=0; i<len; i++){
    	   str[i] = ch[i];
    	}
    	str[len] = '\0';
    };
    
    char & String::operator[](unsigned short int length)
    {
    	    if(length > len){
    		   return str[len-1]; //返回可见字符的值
    		}else{
    		   return str[length];
    		}
    };
    
    char String::operator[](unsigned short int length)const
    {
    	    cout<<"下标运算符const执行"<<endl;
    		if(length > len){
    		   return str[len-1]; //返回可见字符的值
    		}else{
    		   return str[length];
    		}
    };
    
    String::String (const String&rs)
    {
    	len = rs.getlen();
    	str = new char[len+1];
    	for(int i=0; i<len; i++){
    	    str[i] = rs[i]; 
    		//这里因为我们构造一个新对象并且用旧对象来为它赋值,很明显,不会修改旧对象的值,所以旧对象rs在调用operator[]const函数的时候,不用将指定字符串的地址返回,只需要要按值返回这个字符即可
    		//第二次重载的operator[]运算符函数,按值返回的一个字符,同时在函数体前面加了一个const
    		//表示该函数可以操作const对象,也就是rs
    		//这样由于2个同名的函数,它的类型不同,一个可操作const对象,一个不可以,这样就可以做到了对函数的重载
    	}
    	str[len]='\0';
    	cout<<"复制构造函数完成:"<<str<<endl;
    
    };
    int main()
    {
    	String str;
    	cout<<str.getstr()<<endl;
    	cout<<"str:"<<str.getlen()<<endl;
    
    	String s1("hello word");
    	//cout<<s1.getlen()<<endl;
    	cout<<s1.getstr()<<endl;
    	cout<<"s1:"<<s1.getlen()<<endl;
    
    	char*temp = "help me";
    	String s3(temp);
    	cout<<s3.getstr()<<endl;
    	cout<<"s3:"<<s3.getlen()<<endl;
    	
    	//越界的值
    	cout<<"越界的值"<<endl;
    	cin>>s3[999];
    	cout<<s3.getstr()<<endl;
    	cout<<"s3:"<<s3.getlen()<<endl;
    	cout<<"s3[999]:"<<s3[999]<<endl;
    	cout<<s3.getstr()<<endl;
    
        cout<<"调用复制构造函数"<<endl;
    	String s4 = s3; //调用复制构造函数
    	cout<<"s4:"<<s4.getstr()<<endl;
    	cout<<"s4:"<<s4.getlen()<<endl;
    
        return 0;
    }*/
    
    /*
    #include <iostream>
    using namespace std;
    class A
    {
    public: 
    	A(int i, int j){ x=i; y=j;}
    	void set(int s1, int s2){ x=s1; y=s2;}
    	void print(){cout<<x<<endl;}
    	void print()const { cout<<y<<endl;
    	   //set(1,2); 在const函数内不能调用未const函数
    	}
    private:
    	int x, y;
    };
    int main()
    {
    	const A a(2,3); //常量对像
    	a.print();
    	//a.set(22,33); //常量对像不可修改
    
    	A b(4,5);
    	b.print();
    	b.set(44,55);
    	b.print();
    
    	//总结
    	//const对像只能调用const成员函数,并且const对像的值不能被修改,只有const成员函数才有资格操作const对像,没有使用const关键字修饰的成员函数不能用来操作const对像
    	//另外我们还需要认识到:
    	//const不光可以定义常量,而且可用来修饰函数的参数,返回值,甚至函数定义体
    	//const修饰函数参数,表示函数参数不可更改
    	//const修改函数返咽值,表示返回值不可改变
    	//const修饰函数的定义体,表示函数体内就不能修改对像的何意成员
    	//在const成员函数体内试图修改const对像的数据成员的值将会产生语法错误
    	//而且在const函数体中调用非const成员函数也会产生语法错误
    
    	//这样做对基类很有用,我们知道基类的成员函数可以被派生类继承并覆盖,那么假如我们将基类的成员函数前加修饰符const的话,可防止派生类的覆盖函数改变数据成员的值
    
    
        return 0;
    }*/
    

      

  • 相关阅读:
    数据库特性之原子性和一致性
    [linux] 输出重定向与后台运行
    shell编程其实真的很简单(一)
    Java8中的流操作-基本使用&性能测试
    Hadoop到底是干什么用的?
    为什么要有文件系统?文件系统都有哪些种类?
    MySQL insert value与values
    MySQL create语句
    fiddler抓包-简单易操作(二)
    jmeter文件目录说明(一)
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2700765.html
Copyright © 2020-2023  润新知