网站建设重庆,有什么网站可以做微信支付宝支付,网站开发工程师职业,云南网站建设找天软#x1f436;博主主页#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️#x1f525;专栏系列#xff1a;线性代数#xff0c;C初学者入门训练#xff0c;题解C#xff0c;C的使用文章,「初学」C #x1f525;座右铭#xff1a;“不要等到什么都没有了#xff0c;才… 博主主页ᰔᩚ. 一怀明月ꦿ ❤️专栏系列线性代数C初学者入门训练题解CC的使用文章,「初学」C 座右铭“不要等到什么都没有了才下定决心去做” 大家觉不错的话就恳求大家点点关注点点小爱心指点指点 目录 对象的动态创建和销毁
对象的复制
对象的赋值 对象的动态创建和销毁 new和delete这两个运算符实现对内存的动态申请与释放的。如果要动态创建和销毁对象也使用这两个运算符 例如有一个类为Box可以动态创建一个对象 new Box; 这样系统就会从内存堆分配中一块内存空间存放Box的对象调用构造函数初始化对象。如果分配成功new运算符会返回分配的内存的首地址如果返回失败则会返回一个NULL。但是通过new创建的对象没有名字所以在使用new创建对象时都要声明一个指针变量保存对象的首地址例如 Box * ptrnew Box; 另外还可以使用new创建对象时给出实参调用有参的构造函数初始化对象 Box* ptrnew Box(2,2,2); ptr指针就可以访问公用的成员了 ptr-volume(); 如果动态创建对象失败则会返回空指针所以为了安全起见可以判断指针是否为空 if(ptr!NULL)ptr-volume(); 不需要使用动态创建的对象时可以使用delete运算符销毁该对象 delete 指针名delete ptr 这样就可以销毁ptr所指向的对象将对象占用的空间归还给堆使用new动态创建的对象只能通过delete进行销毁系统不会进行自动销毁。如果不销毁堆内存将被逐渐消耗。指针一旦指向动态创建的对象就不要改变指针变量的值了可能会造成动态创建创建的对象无法被销毁也可能指针指向其他对象delete销毁对象时可能会删错对象 对象的复制 对象的复制是指在创建对象时使用已有对象快速复制出完全相同的对象 类名 对象2(对象1); 代入法
类名 对象2对象1; 赋值法 其中对象1是和对象同类的并且已经存在的对象在这种情况下系统会调用一个称为“复制构造函数”的特殊的构造函数。复制构造函数会将对象1的各数据成员的值逐个复制到对象2中相应的数据成员。复制构造函数只有一个形参这个形参就是本类的常引用。复制构造函数的函数体主要是将形参中对象的各数据成员值赋给自己的数据成员为保证数据安全引用加上const看看复制构造函数的函数形式 Box::Box(const Box c)
{lengthc.length; widthc.width; heightc.height;
} 即使程序中没有定义复制构造函数每一个类都有一个复制构造函数编译器会隐式地提供一个。即使定义了其他的构造函数编译器也会提供一个复制构造函数他会将实参对象的非static数据成员逐个复制到创建的对象中。 普通的构造函数和复制构造函数有哪些区别呢 1在形式上普通构造函数一般是形参列表创建对象时通过实参列表给出初始化对象所需要各个数据成员的值。而复制构造函数的形参则只有一个及本类对象的引用。 2在调用时系统会根据实际参数列表的类型来自动选择调用 3调用情况不一样普通构造函数是创建对象时由系统自动调用而复制构造函数是在使用已有的对象复制一个新对象时系统自动调用。以下三种情况才会复制对象1创建一个新对象并用同类对象初始化它。2函数参数是类对象3函数返回值是类对象 如果数据成员有指针变量时复制构造函数会出现指针悬挂问题。 #includeiostream
using namespace std;
class person
{
public:person(char* Name,int Age);person(const person temp);~person();void setAge(int x){agex;}void print();
private:char* name;int age;
};
person:: person(const person temp)//复制构造函数
{namenew char[strlen(temp.name)1];strcpy(name,temp.name);agetemp.age;coutpersson is called!!!endl;
}
person::person(char* Name,int Age)//构造函数
{namenew char[strlen(Name)1];strcpy(name,Name);ageAge;coutpersson is called!!!endl;
}
person::~person()
{coutpersson is calledendl;delete []name;nameNULL;
}
void person::print()
{coutname: nameage: ageendl;
}
int main()
{person s1(张三,23);person s2(s1);s1.setAge(1);s2.setAge(2);s1.print();s2.print();return 0;
} 因此需要我们自己定义一个复制构造函数 对象的赋值 对象赋值的一般形式 对象1对象2; 如果大家还有不懂或者建议都可以发在评论区我们共同探讨共同学习共同进步。谢谢大家