• 拷贝构造


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

     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 }

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

  • 相关阅读:
    windows下在命令行模式下使用MinGW编译C代码,出现cannot find ipthread
    Python入门系列——第4篇
    Python入门系列——第3篇
    python入门系列——第2篇
    Python入门系列——第1篇
    Python入门系列——第0篇
    PAT(乙级)1038
    WPF QuickStart系列之附加属性(Attached Property)
    WPF 自定义Metro Style窗体
    WPF QuickStart系列之数据绑定(Data Binding)
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/11374627.html
Copyright © 2020-2023  润新知