相对于构造和析构 拷贝构造是构造的一种方式
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 << ' ' << 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 }
随意写的主函数 可以根据封装好的类对类内的函数进行调用 通过类内的公有函数对类的私有变量进行赋值