拷贝构造

安稳与你 提交于 2019-11-27 19:39:42

相对于构造和析构 拷贝构造是构造的一种方式

 1 //头文件
 2 #pragma once
 3 #include<iostream>
 4 #include<string.h>
 5 using namespace std;
 6 class ss
 7 {
 8     int ID;
 9     char *name;//默认私有 只能在类的内部使用
10 public://共有方法 里面写共有属性
11     static int x;//全局静态常量区 在类外初始化
12     ss(int id, char name[]);
13     ss(const ss&other);//拷贝构造 参数是同类对象的引用
14     ss();//申请释放对内存
15     void getData()const;
16     static void getX();
17     void showData();
18     ~ss();//释放对象申请的内存
19 };
20 
21 //在头文件中声明函数 在cpp文件中定义类对象 外部定义
 1 #include "ss.h"
 2 int ss::x = 0;
 3 ss::ss()
 4 {
 5     ID = 0;
 6     name = new char[1];
 7     strcpy(name, "");
 8     cout << "构造函数" << endl;//测试调用几次构造函数
 9 
10 }
11 
12 
13 ss::~ss()
14 {
15     if (name != nullptr){
16         delete[] name;
17         name = nullptr;
18         cout << "析构函数"<<endl;//测试调用几次析构函数
19     }
20 }
21 
22 ss::ss(int id, char *name){
23     ID = id;//给类内id传参
24     this->name = new char[strlen(name) + 1];
25     strcpy(this->name, name);//加上this区分形参和成员变量 this—>是在类内的name自己原来拥有的 后面的name是形参
26 }
27 void ss::showData(){
28     cout << ID << '\t' << name << endl;//输出类内ID的值
29 }//不是类重载需要加上申明void
30 ss::ss(const ss& other){
31     this->name = new char[strlen(other.name) + 1];
32     strcpy(this->name, other.name);//两个指针单独指向一块堆内存
33 
34     //this->name = other.name;两个指针指向同一块内存 如果有堆内存 避免使用这种形式
35     this->ID = other.ID;
36     //student *const  this  指针常量 地址不可以修改
37 }

类和命名空间有些地方类似 都有封装 的作用都需要用到::域名解析符来调用内部参数保证了数据的安全性 但降低了数据的利用效率

 1 #include<iostream>
 2 #include"ss.h"
 3 using namespace std;
 4 void fun(ss s)//没有使用引用 那么s是新的对象 
 5 {                    //用同类的对象去给新的对象赋初值  调用了拷贝构造
 6     s.showData();    //如果参数不是引用是对象  那么传参的时候调用拷贝构造
 7 }
 8 int main(){
 9     { ss a;
10     ss a1(12,"liugang");
11     fun(a1);//调用拷贝构造输出值
12 
13     ss s1(12,"seven");
14     ss s2 = s1;//
15     fun(s2);//输出s2中的值
16     a.x=1;//修改static x的值
17     ss::x = 3;//也可直接修改x的值
18     cout << a.x << endl;
19     }//将析构函数显示出来利用{}作为作用域代码结束后调用
20     cin.get();
21     return 0;
22 }

随意写的主函数 可以根据封装好的类对类内的函数进行调用 通过类内的公有函数对类的私有变量进行赋值

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!