专栏首页Golang开发C++基础构造函数(constructor)

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

构造函数定义

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

构造函数语法

class 类名
{
public:
    类名(参数列表)
{
   函数体
}
private:
   数据成员
};

构造函数的特点:

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

构造函数的调用

显示调用构造函数

Student studentOne = Student("st1",20);

隐式调用构造函数

Student studentTwo("st2",21);

new创建指针

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

Student *studentThree = new Student("St3",18);

构造函数的作用

初始化对象的数据成员。

构造函数的种类

默认构造函数

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

Student stu;

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

Student::Student(){}

注意:

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

无参构造函数

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

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;
}

自定义带参数构造函数

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

  Student(string s_Name):s_Name(s_Name){}

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

 Student(int id ,string name = "default baxiang",int age = 0){
          s_ID = id;
          s_Name = name;
          s_age = age;
    }

包含成员对象的构造函数

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

<类名>::<类名>(<总参数表>):<成员对象1>(<形参表1>), <成员对象2>(<形参表2>),……
{ //函数体 }
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;
}

拷贝构造函数(复制构造函数)

class 类名
{
public:
          类名:(类名 & 变量名)
         {
           函数体
         }
};

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

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;
}

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

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;
}

浅拷贝与深拷贝

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 干货 | 小程序多页面接口数据缓存

    小程序里面多个页面,有时候会需要用到同一个接口的数据。而这些数据全局来说只需要拉取一遍,如果要存到缓存,要怎么保证其他页面取缓存的时候,数据已经拉取回来了呢?

    腾讯NEXT学位
  • Spring Boot 整合 apollo

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治...

    程序员果果
  • LayaAir 2.1.0 已废除Canvas API兼容,3D现有功能丰富与易用性再次加强!

    今天,我们发布了一个引擎大版本LayaAir 2.1.0 beta,从此我们进入了纯webGL模式的2.1.x时代。浏览器自带的canvas API从这个版本开...

    Layabox Charley
  • Chrome 74 带来的新功能[每日前端夜话0x66]

    Chrome 74 已经发布了,虽然从用户的角度来看并没有什么令人兴奋的东西,但是对开发人员来说带来了一些好处。新版本附带了新的 Javascript 私有类字...

    疯狂的技术宅
  • 你比个手势,AI就识别出Emoji,浏览器上跑:已开源,推特2.8万赞

    AI的爸爸,名字叫Nick Bourdakos (简称“尼克”) ,是来自IBM的程序猿。

    量子位
  • “我比Goodfellow提前三年想到了GAN”

    2014年的一晚,Ian Goodfellow和一个刚刚毕业的博士生一起喝酒庆祝。在蒙特利尔一个酒吧,一些朋友希望他能帮忙看看手头上一个棘手的项目:计算机如何自...

    大数据文摘
  • Python列表推导(list comprehension)VS 生成器表达式(generator expression

    列表是一种可以表示为元素集合的数据。一个简单的列表如下所示:[0, 1, 2, 3, 4, 5] 列表将所有可能类型的数据和数据组合作为其元素:

    银河1号
  • 13个帮你提高开发效率的现代CSS框架[每日前端夜话0x67]

    本文将向你介绍一系列顶级CSS框架。有些人可能听说过,也可能对有些人是全新的。但它们都提供了各种有用的先进功能,可以改善你的工作流程。开始吧!

    疯狂的技术宅
  • 【开源公告】微信智聆口语评测小程序开源

    由微信智聆语音团队研发的智聆口语评测小程序插件,能够对学习者的发音进行自动评测打分,检测发音中存在的错误。评测人群支持从儿童到成人年龄全覆盖;评测方式涵盖单词、...

    腾讯开源
  • Dijkstra算法

    Dijkstra算法使用了广度优先搜索解决赋权有向图(或无向图)的单源最短路径问题。

    mwangblog

扫码关注云+社区

领取腾讯云代金券