首页 > 其他 > 详细

2.类的构造、析构、拷贝构造

时间:2020-03-18 10:54:42      阅读:56      评论:0      收藏:0      [点我收藏+]

1.类是一种抽象数据类型,本身不占用内存空间,当分配对象后才会占用内存空间,对数据以及操作数据的方法进行封装。

class Student
{
protected:
    int age;  //成员变量
    string name;
public:
    void sleep(){};//成员函数
    void study(){};
    void eat(){};·
};

  类中的成员权限分为三种:public、private、protected

public 在类外可以通过对象直接访问
public 对外隐藏, 对子类开放,类内部使用(在类的成员函数中使用)
private 对外隐藏, 只能在类内部使用(在类的成员函数中使用)
没有指定权限 默认是私有权限,对外隐藏

 

2.构造与析构函数

  构造函数

    1. 函数名与类名相同

    2. 函数没有返回值(也不能是void)

    3. 在创建类对象后自动调用(不能自己调用)

    4. 如果没有自定义构造函数,编译器系统会自动生成一个不带参数的构造函数

  析构函数:

    1. 函数名是在类名前面添加~

    2. 函数没有返回值,也么有参数

    3. 函数在对象销毁的时候自动调用

    4. 如果没自定义析构函数,系统会自动生成一个析构函数

#include <iostream>
using namespace std;
class Person{
public:
    Person()//构造函数
    {
        cout<<"Person()"<<endl;
        sex = "";
    }
    ~Person()//析构函数
    {
        cout<<"~Person()"<<endl;

         }

  private:

         int age;

         string name;

         string sex;

  protected:

};

   构造函数是可以带参数的,如下:

class Person{
public:
    Person(string s,char *n,int age)//构造函数带着三个参数
    {
        cout<<"Person()"<<endl;
        sex=s;
        name=new char[32];
        strcpy(name,n);
        this->age=age;
    }
}

  如果没有其他的构造函数,在创建对象的时候必须制定这三个参数
  Person jack("男","jack",18);//传参数给构造函数

  this指针:在类的成员函数中会隐含一个对象的指针参数,this代表的是谁调用函数,那么就用谁的this指针,this指针一般用来区分成员变量与函数中的局部变量的冲突。

  

  构造函数重载

  Person jack;//可以类中重载  Person::Person();

  Person jack("男","jack",18)   Person::Person(string s,const char *n,int age)

class Person{
public:
    Person()
    {
        cout<<"Person()"<<endl;
        sex="";
        name=new char[32];
        strcpy(name,"jack");
        this->age=19;
    }

    //重载的构造函数
    Person(string s,const char *n,int age)
    {
        cout<<"Person(string,char *,int")<<endl;
        sex=s;
        name=new char[32];
        strcpy(name,n);
        this->age=age;
    }
}

  构造函数缺省参数

class Person{
public:
    //构造函数
    Person(string s=""const char *n="jack",int age=19)
    {
        cout<<"Person(string,char *,int")<<endl;
        sex=s;
        name=new char[32];
        strcpy(name,n);
        this->age=age;
    }
}

  //创建对象

  Person jack0;//调用不带参数的构造函数

  Person jack("男","jack",18);//给参数的构造函数

 

  构造函数-成员参数列表初始化,格式:

Person(string s="",char *n="jack",int age=19):sex(s),age(age){...}

  把括号里面的内容(参数,常量..)赋值给括号外面的成员,成员参数列表初始化,在创建类对象的时候申请空间同时立即(用括号里面的值)初始化

  应用:1.成员变量是常量

     2.继承的时候调用父类的构造函数

 

  类的成员函数在类内声明,类外实现

//成员函数在类内声明
class Person{
public:
    Person(string s="",char *n="jack",int age=19)//声明部分写默认参数
    ~Person();
    void show();
private:
    int age;
    char *name;
    string sex;
protected:
}

//成员函数在类外实现
Person::Person(string s,char *n,int age):age(age),sex(s){}//实现对部分成员参数列表的初始化
Person::~Person(){}
void Person::show(){}

 

  拷贝构造函数

    1.拷贝构造函数也是构造函数,参数是一个对象的引用

    2.如果没有自定义拷贝构造函数,系统会自动生成一个默认的拷贝构造函数(浅拷贝)

    3.下面的情况会调用拷贝构造函数

Person jack("","jack",19);
Person rose=jack;
Person rose(jack);

  

  浅拷贝---系统默认就是,不需要自己去实现,格式:Person(Person& p);

技术分享图片

 

 

class Person{
public:
    //构造函数的声明
    Person(const char *name="jack",string sex="man",int age=18);
    //拷贝构造
    Person(Person& p);
    ~Person();
    void show();
private:
    char *name;
    string sex;
    int age;
}

//构造函数逇实现
Person::Person(const char *name,string sex,int age):sex(sex),age(age)
{
    cout<<"Person()"<<endl;
    this->name=new char[32];
    strcpy(this->name,name);
}

Person::Person(Person& p)
{
    cout<<"Person(Person& p)"<<endl;
    //浅拷贝只对对象成员进行赋值
    this->age=p.age;
    this->sex=p.sex;
    this->name=p.name;
}

Person::~Person()
{
    delete []name;
}

void Person::show(){}

  深拷贝---需要自己去实现,拷贝对象本身空间的同时还要拷贝成员指向的堆空间

 技术分享图片

 

 

#include <iostream>
#include <cstring>
using namespace std;

class Person{
public:
    //构造函数声明
    Person(const char *name="jack",string sex="man",int age=16);
    //拷贝构造
    Person(Person& p);
    ~Person();
    void show();
private:
    char *name;
    string sex;
    int age;
}

//构造函数实现
Person::Person(const char *name,string sex,int age):sex(sex),age(age)
{
    cout<<"person()"<<endl;
    this->name=new char[32];
    strcpy(this->name,nama);
}

Person::Person(Person& p)
{
    cout<<"Person(Person&"<<endl;
    //深拷贝--拷贝对象空间的同时还要拷贝成员指向的堆空间
    this->age=p.age;
    this->sex=p.sex;
    this->name=p.name;
    strcpy(this->name,p.name);
}

Person::~Person()
{
    cout<<"~Person()"<<endl;
    delete []name;
}

void Person::show(){}

int main()
{
    //创建对象
    Person jack("man","jack",20);
    jack.show();
    //拷贝构造创建对象
    Person rose(jack);
    rose.show();
    return 0;
}

 

PS:如果有哪里写错了,请指正,大家互相学习。

2.类的构造、析构、拷贝构造

原文:https://www.cnblogs.com/smallqizhang/p/12462389.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!