对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况
// 对象做函数参数和返回值.cpp : 定义控制台应用程序的入口点。
//exit(0)表示正常退出程序,exit(0)表示异常退出
//在调用input时,编译器用对象A去创建了形参对象temp,调用了复制构造函数,对象A中的数据复制给了对象temp
// 在input函数中,执行temp.set(s),为对象temp中数据成员str申请了动态储存空间,并设置了输入的字符串
//并没有改变实参A中的数据成员str的储存空间,故在执行语句A.show()后输出的字符串并没有改变。在函数调用结束后
//将对象temp做为函数返回值来创建对象B,所以对象B的数据成员str的值是调用input函数时输入的字符串
#include<iostream>
#include<cstring>
using namespace std;
class Cstream
{
public:
Cstream(char *s);
Cstream(const Cstream& temp);//copy constructor function
~Cstream();
void show();
void set(char *s);
private:
char *str;
};
Cstream::Cstream(char * s)
{
cout << "constructor" << endl;
str = new char[strlen(s) + 1];
if (!str)
{
cerr << "Allocation Error" << endl;
exit(1);//error 退出程序
}
strcpy(str, s);
}
Cstream::Cstream(const Cstream & temp)
{
cout << "copy constructor" << endl;
str = new char[strlen(temp.str) + 1];
if (!str)
{
cerr << "error in apply new space" << endl;
exit(1);
}
strcpy(str,temp.str);
}
Cstream::~Cstream()
{
cout << "destructor" << endl;
if (str != NULL)
delete[] str;//释放str指向的储存空间
}
void Cstream::show()
{
cout << str << endl;
}
void Cstream::set(char * s)
{
delete[] str;
str = new char[strlen(s) + 1];
if (!str)
{
cerr << "Allocation Error" << endl;
exit(1);
}
strcpy(str, s);
}
Cstream input(Cstream temp)//对象作为参数和返回值的普通函数
{
char s[20];
cout << "please input the string:";
cin >> s;//输入新字符串
temp.set(s);//赋值新字符串
return temp;//返回对象
}
int main()
{
Cstream A("Hello");
A.show();
Cstream B = input(A);//用input的函数值初始化对象B
A.show();
B.show();
return 0;
}