美文网首页
C++创建对象的几种方式

C++创建对象的几种方式

作者: ag4kd | 来源:发表于2019-10-16 19:08 被阅读0次

[toc]

一、创建对象的方式

1.1 使用非默认构造函数来创建对象的几种形式

1.1.1 显式调用:方式1

Person person = Person("binny1", 26);

这种方式创建对象,C++标准允许编译器使用两种方式来执行:

1、会创建一个临时对象,然后将临时对象复制到person中,并丢弃临时对象。此时,将为临时对象调用析构函数,正如上面的结果。

编译器肯能立即删除临时对象,也可能过一会儿。

1.1.2 隐式调用:方式2

Person person2("binny2", 27);//会创建临时对象

这种格式更紧凑,它与显示调用等价。

1.1.3 构造函数与new关键字一起使用:方式3

Person *pPerson3 = new Person("binny3", 8);//不会创建临时对象

这条语句创建一个Person对象,将其初始化为参数列表提供的值,并将该对象的地址赋给pPerson指针。

这种情况下对象没有名字,但可以使用指针来管理对象。

1.1.4 列表初始化

如果编译器支持C++11,则可以用时列表初始化。只要提供的大括号列表中的数据与某个构造函数的参数列表匹配就可以。

方式4

Person person4 = {"binny4", 26};//c++11,会创建临时对象

方式5

Person person5{"binny5", 26};//c++11,会创建临时对象

方式6

Person *pPerson6 = new Person{"binny6", 26};//c++11,不会创建临时对象

方式6

Person person{};//与默认构造函数相匹配

1.2 使用默认构造函数来创建对象

1.2.1 显示调用

方式7

Person person = Person();

1.2.2 隐式调用

方式8

Person person;

隐式调用默认构造函数,不要使用圆括号

拷贝构造函数

当用一个对象去生成(初始化)另一个对象时,编译器并不是调用普通的构造函数生成该对象,而是以位拷贝的方式生成该对象。

X a ;//默认构造函数
X b = a;//拷贝构造函数

二 案例源码

2.1 头文件

//
// Created by Biter on 2019/10/16.
//
#include <iostream>

#ifndef NDK_PERSON_H
#define NDK_PERSON_H

using namespace std;

class Person {

private:
    char *mName;
    int mAge;
public:
    Person();

    Person(int age);

    Person(char *name, int age);

    void setName(char *name);

    void setAge(int age);

    char * getName();

    int getAge();

    ~Person();
};

#endif //NDK_PERSON_H

2.2 头文件的实现

//
// Created by Biter on 2019/10/16.
//

#include "../includes/Person.h"

Person::Person() {
    mName = "biter";
    mAge = 26;
    std::cout<<"默认构造函数"<<std::endl;
}

Person::Person(char *name, int age) {
    mName = name;
    mAge = age;
    cout << "Hello  " << mName << endl;
}

Person::Person(int age) {
    mAge = age;
}

void Person::setName(char *name) {
    mName = name;
}

void Person::setAge(int age) {
    mAge = age;
}

int Person::getAge() {
    return mAge;
}

char *Person::getName() {
    return mName;
}

Person::~Person() {
    cout << "Bey  " << mName << endl;
}```
## 2.3 项目代码

```c
//
// Created by Biter on 2019/10/15.
//
#include <iostream>
#include "includes/Person.h"

int main() {
   Person person0;//补充的
    //第一种创建对象的方式
    Person person1 = Person("binny1,显示调用构造函数", 26);
//    //第二种创建对象的方式
    Person person2("binny2,隐式调用构造函数", 27);
//    //第三种创建对象的方式
    Person *pPerson3 = new Person("binny3,动态创建对象", 8);

    //c++11 列表初始化
    Person person4 = {"binny4,显示列表初始化", 26};
    Person person5{"binny5,隐式列表初始化", 26};
    Person *pPerson6 = new Person{"binny6,动态列表初始化", 26};

    std::cout << "person1 name = " << person1.getName() << std::endl;
    std::cout << "person2 name = " << person2.getName() << std::endl;
    std::cout << "person3 name = " << pPerson3->getName() << std::endl;
    std::cout << "person4 name = " << person4.getName() << std::endl;
    std::cout << "person5 name = " << person5.getName() << std::endl;
    std::cout << "person6 name = " << pPerson6->getName() << std::endl;

    Person person7 = 26;
    person7.setName("p9");
    std::cout << "p9.getAge() = " << person7.getAge() << std::endl;
    return 0;
}

运行结果

可以看到,一个像套娃一样的方式,先创建的后析构。


image.png

C++提供了多种对象的创建方式,每次创建对象时(包括使用new动态分配内存),C++都是用类的构造函数。

从运行结果看出,动态创建对象的时候,没有调用析构函数。

相关文章

  • C++创建对象的几种方式

    [toc] 一、创建对象的方式 1.1 使用非默认构造函数来创建对象的几种形式 1.1.1 显式调用:方式1 这种...

  • 字面量方式及内置构造函数创建对象

    创建对象的几种方式 字面量方式创建对象 基本写法 ①字面量的方式来创建对象示例 存在的问题 [01] 代码复用性差...

  • 16、Java创建对象有几种方式?

    Java创建对象有几种方式? java中提供了以下四种创建对象的方式: 1、new创建新对象; 2、通过反射机制;...

  • 创建对象的几种方式

    字面量方式和Object构造函数方式创建对象 优点: 方便缺点: 当需要创建很对对象的时候,会有很多重复的代码 工...

  • 创建对象的几种方式

    第一种:对象字面量的方式 第二种:创建Object实例: 第三种:数构造函数无参数构造函数 带参数的构造函数 第四...

  • 创建对象的几种方式

    真是百看不如一练啊 /*var box= new Object(); //创建一个对象 box.name= "xi...

  • 创建对象的几种方式

    字面量创建对象 new Object() 创建对象 工厂模式 构造函数 原型 混合

  • 创建对象的几种方式

    字面量式(最常用) 调用系统的Object构造函数,创建实例对象 工厂模式 构造函数模式 与工厂模式的区别: 没有...

  • 创建对象的几种方式

    1.工厂模式 就像工厂里做好的模具厂一样,一个一个的返回 2、构造函数式 这种方式会经历四个步骤1.创建一个新对象...

  • 创建对象的几种方式

    1.工厂模式 使用方式 2.构造函数(缺点:每个方法需要在原型上构建一遍,重复) 使用方式及测试 3.原型模式(原...

网友评论

      本文标题:C++创建对象的几种方式

      本文链接:https://www.haomeiwen.com/subject/vinumctx.html