C++学习笔记 04 构造函数 和 析构函数

一、不写构造函数带来的问题

  1. 属性值未被初始化,是内存上的脏数据
  2. 创建对象语句,于编译期报错:Using uninitialized memory
  3. 不同于java,属性有默认值,C++属性的初始值需要程序员手动指定
#include<iostream>

class Entity {
public:
    int x, y;
    void print() {
        //-858993460 , -858993460
        std::cout << x << " , " << y << std::endl;
    }
};

int main() {
        //1. 内部方法调用时,会显示未初始化的内存数据
    Entity e;
        e.print();

        //2. 外部直接访问未初始化属性的对象时,编译报错
    //如果没有构造函数:编译报错:Using uninitialized memory 'e'.
    // 如果有空构造函数:-858993460 , -858993460
    std::cout << e.x << " , " << e.y << std::endl;
}

二、隐藏构造函数的2种方式

  1. private
  2. delete
#include<iostream>

class Log {
private:
    //1. 隐藏默认构造函数方式一
    Log() {}
public:
    //2. 隐藏默认构造函数方式二
    //Log() = delete;

    static void write(const char* message) {
        std::cout << message << std::endl;
    }
};

int main() {
    Log::write("Hello");
    Log log;
    log.write("World");
}

三、析构函数

在当前栈区释放时,该栈中的对象会背释放,此时调用析构函数

#include<iostream>

class Entity {
public:
    Entity() {
        x = 0;
        y = 0;
        std::cout << "Create Entity!" << std::endl;
    };
    ~Entity() {
        std::cout << "Destroy Entity!" << std::endl;
    };
    int x, y;

    void print() {
        //-858993460 , -858993460
        std::cout << x << " , " << y << std::endl;
    }
};

//需要挪到main函数之外,能看到析构函数的调用
void testDestructor() {
    Entity e;
    e.print();
}


int main() {
    //对象在栈上创建,当作用域(当前方法)结束时会被自动销毁
    //最后一行代码:std::cin.get(); 执行完成后, 当前栈被销毁,e,被销毁,执行e的析构函数。但黑窗口已经不见了
    //所以将此调用移到main函数之外
    //Entity e;

    //如果没有构造函数:编译报错:Using uninitialized memory 'e'.
    // 如果有空构造函数:-858993460 , -858993460
    //std::cout << e.x << " , " << e.y << std::endl;
    //e.print();
    
    testDestructor();
    std::cin.get();

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容