#include <string>
#include <iostream>
using namespace std;
class Fruit //定义一个类,名字叫Fruit
{
string name; //定义一个name成员
string colour; //定义一个colour成员
public:
void print() //定义一个输出名字的成员print()
{
cout<<colour<<" "<<name<<endl;
}
Fruit(const string &nst = "apple",const string &cst = "green"):name(nst),colour(cst){} //构造函数
};
int main()
{
Fruit apple; //定义一个Fruit类对象apple
Fruit apple2(apple);//调用的是我们自己定义的复制构造函数
apple.print();
apple2.print(); //你会发现输出多了个's'
return 0;
}
输出:
pateo@pateo-B86N53X:~/work/study$ ./main
green apple
green apple
pateo@pateo-B86N53X:~/work/study$
对比下面
#include <string>
#include <iostream>
using namespace std;
class Fruit //定义一个类,名字叫Fruit
{
string name; //定义一个name成员
string colour; //定义一个colour成员
public:
void print() //定义一个输出名字的成员print()
{
cout<<colour<<" "<<name<<endl;
}
Fruit(const string &nst = "apple",const string &cst = "green"):name(nst),colour(cst){} //构造函数
Fruit(Fruit &aF):name(aF.name),colour(aF.colour) //这是我们自己定义的复制构造函数
{
name +="s"; //让他和默认的不同
}
};
int main()
{
Fruit apple; //定义一个Fruit类对象apple
Fruit apple2(apple);//调用的是我们自己定义的复制构造函数
apple.print();
apple2.print(); //你会发现输出多了个's'
return 0;
}
输出:
pateo@pateo-B86N53X:~/work/study$ g++ main.cc -o main
pateo@pateo-B86N53X:~/work/study$ ./main
green apple
green apples
pateo@pateo-B86N53X:~/work/study$
对比下面
#include <string>
#include <iostream>
using namespace std;
class Fruit //定义一个类,名字叫Fruit
{
string name; //定义一个name成员
string colour; //定义一个colour成员
public:
void print() //定义一个输出名字的成员print()
{
cout<<colour<<" "<<name<<endl;
}
Fruit(const string &nst = "apple",const string &cst = "green"):name(nst),colour(cst){} //构造函数
};
private:
Fruit(Fruit &aF):name(aF.name),colour(aF.colour) //这是我们自己定义的复制构造函数
{
name +="s"; //让他和默认的不同
}
int main()
{
Fruit apple; //定义一个Fruit类对象apple
Fruit apple2(apple);//调用的是我们自己定义的复制构造函数
apple.print();
apple2.print(); //你会发现输出多了个's'
return 0;
}
输出:
pateo@pateo-B86N53X:~/work/study$ g++ main.cc -o main
main.cc:17: error: expected unqualified-id before ‘private’
pateo@pateo-B86N53X:~/work/study$
再对比下面的
#include <string>
#include <iostream>
using namespace std;
class Fruit //定义一个类,名字叫Fruit
{
string name; //定义一个name成员
string colour; //定义一个colour成员
public:
void print() //定义一个输出名字的成员print()
{
cout<<colour<<" "<<name<<endl;
}
Fruit(const string &nst = "apple",const string &cst = "green"):name(nst),colour(cst){} //构造函数
Fruit(Fruit &aF):name(aF.name),colour(aF.colour) //这是我们自己定义的复制构造函数
{
name +="s"; //让他和默认的不同
}
};
int main()
{
Fruit apple; //定义一个Fruit类对象apple
Fruit apple2 = apple;//调用的是我们自己定义的复制构造函数
apple.print();
apple2.print(); //你会发现输出多了个's'
cout<<"------------------ "<<endl;
Fruit apple3 ;
apple3.print();
apple3 = apple;
apple3.print();
return 0;
}
输出:
pateo@pateo-B86N53X:~/work/study$ g++ main.cc -o main
pateo@pateo-B86N53X:~/work/study$ ./main
green apple
green apples
------------------
green apple
green apple
pateo@pateo-B86N53X:~/work/study$
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝
以上都是浅复制,下面主要解释复制函数:
#include <iostream>
using namespace std;
class CA
{
public:
CA(int b,char* cstr)
{
a=b;
str=new char[b];
strcpy(str,cstr);
}
CA(const CA& C)
{
a=C.a;
str=new char[a]; //深拷贝
if(str!=0)
strcpy(str,C.str);
}
void Show()
{
cout<<str<<endl;
}
~CA()
{
delete str;
}
private:
int a;
char *str;
};
int main()
{
CA A(10,"Hello!");
CA B=A;
B.Show();
return 0;
}
其中下面为析构函数:
~CA()
{
delete str;
}
复制构造函数在构造数组对象的使用
Sales_item primer_eds[] = {
string("0-201-16487-6");
string("0-201-16487-8");
string("0-201-16487-1");
Sales_item();
};