前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++基础构造函数(constructor)

C++基础构造函数(constructor)

作者头像
羊羽shine
发布2019-05-28 13:24:36
4600
发布2019-05-28 13:24:36
举报
文章被收录于专栏:Golang开发Golang开发

构造函数定义

C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数,构造函数在定义时可以有参数;但是是没有任何返回类型的声明。

构造函数语法

代码语言:javascript
复制
class 类名
{
public:
    类名(参数列表)
{
   函数体
}
private:
   数据成员
};

构造函数的特点:

  1. 函数名称就是当前的类名称。
  2. 构造函数没有返回值

构造函数的调用

显示调用构造函数
代码语言:javascript
复制
Student studentOne = Student("st1",20);
隐式调用构造函数
代码语言:javascript
复制
Student studentTwo("st2",21);
new创建指针

创建一个Student对象,并将该对象的地址赋给studentThree指针,对象没有名称,但是可以通过指针来管理对象。

代码语言:javascript
复制
Student *studentThree = new Student("St3",18);

构造函数的作用

初始化对象的数据成员。

构造函数的种类

默认构造函数

默认构造函数实在未提供显示初始化值用来创建对象的,主要用于下面这种情况.

代码语言:javascript
复制
Student stu;

默认构造函数可能如下函数:

代码语言:javascript
复制
Student::Student(){}

注意:

  1. 只有当且仅当类没有定义任何构造函数的情况下,编译器才会创建默认构造函数。 2.当类中定义了构造函数,但是没有提供默认构造函数,下面的声明是错误的:所以如果想使用默认构造函数必须重载来定义一个没有参数的构造函数。
代码语言:javascript
复制
Student()
    {
        name = "";
        age = 0;
    }
无参构造函数

编译器本身会提供一个无参的构造函数,但是这个系统的无参构造函数实际意义没有太大,因为系统默认的无参构造函数没有给成员属性提供初始值,而是会随机分配初始值,因此通常自定义的无参构造函数会对类中的数据进行初始值。

代码语言:javascript
复制
class Student
{
public:
    Student()
    {
        s_Name = "default name";
    }
    string getName()
    {
        return s_Name;
    }
private:
   string s_Name;
};

int main(int argc, char *argv[])
{
    Student stu;
    cout<<"name: " << stu.getName() <<endl;
    return 0;
}
自定义带参数构造函数

通过初始化列表实现构造参数,就是在参数列表的后面加冒号“:”

代码语言:javascript
复制
  Student(string s_Name):s_Name(s_Name){}

默认参数得构造函数 默认参数的构造函数 需要防止调用的二义性,构造函数的第n个参数有默认值,则其后的所有参数都有默认值

代码语言:javascript
复制
 Student(int id ,string name = "default baxiang",int age = 0){
          s_ID = id;
          s_Name = name;
          s_age = age;
    }
包含成员对象的构造函数

个类的对象时,应先调用其构造函数。但是如果这个类有成员对象,则要先执行成员对象自己所属类的构造函数,当全部成员对象都执行了自身类的构造函数后,再执行当前类的构造函数

代码语言:javascript
复制
<类名>::<类名>(<总参数表>):<成员对象1>(<形参表1>), <成员对象2>(<形参表2>),……
{ //函数体 }
代码语言:javascript
复制
class SDate
{
public:
    SDate(int y,int m,int d);
    void show();


private:
    int year,month,day;
};
SDate::SDate(int y,int m,int d)
{
    year = y;
    month = m;
    day = d;
}
void SDate::show()
{
        cout<<year<<month<<day<<endl;
 }

class Student
{
public:
   Student(string name,int y,int m,int d);
   void printInfo();
private:
    string s_Name;
    SDate birthday;
};

Student:: Student(string name,int y,int m,int d):birthday(y,m,d){
    s_Name = name;
}
拷贝构造函数(复制构造函数)
代码语言:javascript
复制
class 类名
{
public:
          类名:(类名 & 变量名)
         {
           函数体
         }
};

使用一个对象初始化另外一个新的对象

代码语言:javascript
复制
class Student
{
public:
    Student(string n,int a){
        name =n;
        age = a;
    }
    Student(Student &s){
        name = s.name;
        age = s.age;
    }
   void printInfo()
   {
       cout<<"name " <<name << " age "<<age <<endl;
   }
private:
    string name;
    int age;
};

int main(int argc, char *argv[])
{
    Student student("baxiang",18);
    student.printInfo();
    Student copyS(student);
    copyS.printInfo();
    return 0;
}

对象作为函数参数 当参数为对象是 会调用拷贝构造函数

代码语言:javascript
复制
class Student
{
public:
    Student(string n,int a){
        name =n;
        age = a;
    }
    Student(Student &s){
        cout<<"copy func"<<endl;
        name = s.name;
        age = s.age;
    }
    void printInfo()
    {
        cout<<"name " <<name << " age "<<age <<endl;
    }
private:
    string name;
    int age;
};

void printStudent(Student s)
{
    s.printInfo();
}
int main(int argc, char *argv[])
{
    Student student("baxiang",18);
    printStudent(student);
    return 0;
}

浅拷贝与深拷贝

浅拷贝是只拷贝指针地址,意思是浅拷贝指针都指向同一个内存空间,当原指针地址所指空间被释放,那么浅拷贝的指针全部失效。 深拷贝是先申请一块跟被拷贝数据一样大的内存空间,把数据复制过去。这样拷贝多少次,就有多少个不同的内存空间,数据之间相互独立互不影响。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 构造函数定义
  • 构造函数语法
  • 构造函数的调用
    • 显示调用构造函数
      • 隐式调用构造函数
        • new创建指针
        • 构造函数的作用
        • 构造函数的种类
          • 默认构造函数
            • 无参构造函数
              • 自定义带参数构造函数
                • 包含成员对象的构造函数
                  • 拷贝构造函数(复制构造函数)
                  • 浅拷贝与深拷贝
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档