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