05.构造函数属性初始化 static关键字 常量函数

简介: (创建于2017/12/24)如果一个类中属性有另一个类或者有const类型,如何初始化 #define _CRT_SECURE_NO_WARNINGS#include "iostream" //包含c++的头文件using namespa...

(创建于2017/12/24)

如果一个类中属性有另一个类或者有const类型,如何初始化
 #define  _CRT_SECURE_NO_WARNINGS
#include "iostream"  //包含c++的头文件
using namespace std;

class A {
public:
    A(int a) {

    }
};

class B {
public:
    int b;
    A a;
    A a2;
    const int c;
    B(int b):a(1),a2(2),c(3){

    }
    B(int a, int b, int c, int d,int e) :a(c), a2(d),c(e){

    }
};

int main() {
    B b(1,2,3,4,5);
    system("pause");
    return 0;
}
构造函数中调用构造函数

分析一下下边这个函数,为什么最终打印c得到的是一个很奇怪的数字呢?函数执行到 B b(1,2);的时候会执行B的两个参数的有参构造方法,将ab初始化,然后在此调用三个有参构造方法,传入三个值1,2,100,我们知道调用函数的构造方法会默认产生一个匿名对象,这个匿名对象是B的另一个对象,和b是不同的,由于这个对象没有被接收,导致执行完成之后就调用了他的析构函数销毁了这个对象,所以到此位置,b的c就没有被赋值过,所以打印的是这样的结果

 #define  _CRT_SECURE_NO_WARNINGS
#include "iostream"  //包含c++的头文件
using namespace std;

class B {
public:
    int b;
    int c;
    int d;
    B(int a,int b){
        this->b = a;
        this->c = b;
        B(a, b, 100);
    }

    B(int c, int d, int e) {
        this->b = c;
        this->c = d;
        this->d = e;
    }
    ~B(){
        printf("析构函数执行:%d,%d,%d\n", b, c, d);
    }
};

int main() {
    B b(1,2);
    printf("c:%d\n", b.d);
    system("pause");
    return 0;
}

打印结果
析构函数执行:1,2,100
c:-858993460
请按任意键继续. . .
//注意构造和析构的顺序:
//先执行类内部的对象的构造方法,再执行的类的构造方法,析构函数则是先执行的外层的析构函数,然后执行的对象属性的析构函数

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>   //这个头文件和命名空间有一个不存在 cout就无法使用
using namespace std;
class Teacher {
private:
    char* name;
public:
    Teacher(char* name) {
        this->name = name;
        cout << "Teacher有参构造函数" << endl;
    }
    ~Teacher() {
        cout << "Teacher析构函数" << endl;
    }
    char* getName() {
        return this->name;
    }

};

class Student {
private:
    int id;
    Teacher t1;
public:

    //属性对象通过构造方法初始化
    Student(int id, char *n1, char *n2):t1(n1) {
        this->id = id;
        cout << "Student有参构造函数" << endl;
    }
    void myprint() {
        cout << id << "," << t1.getName()<< endl;
    }
    ~Student() {
        cout << "Student析构函数" << endl;
    }
};

void func() {
    Student s1(10, "miss bo", "mrs liu");
    s1.myprint();
}
C和C++开辟内存对比
 #define  _CRT_SECURE_NO_WARNINGS
#include "iostream"  //包含c++的头文件
using namespace std;

class B {
public:
    int b;
    int c;
    int d;
    B(int a,int b){
        this->b = a;
        this->c = b;
        B(a, b, 100);
    }

    B(int c, int d, int e) {
        this->b = c;
        this->c = d;
        this->d = e;
    }
    ~B(){
        printf("析构函数执行:%d,%d,%d\n", b, c, d);
    }
};

int main() {
    ///////////////////基本数据类型///////////////////////
    //C
    int *a = (int *)malloc(sizeof(int));
    *a = 10;
    printf("*a=%d\n", *a);
    free(a);

    //C++
    int *b = new int();
    *b = 20;
    cout << "*b="<<*b<< endl;
    delete b;
    ///////////////////数组类型///////////////////////
    //C
    int *c = (int *)malloc(sizeof(int) * 10);
    *(c + 3) = 30;
    printf("第三个数组元素值=%d\n", c[3]);
    free(c);

    //C++
    int *d = new int[10];
    *(d + 4) = 40;
    cout << "第四个数组元素="<<d[4]<< endl;
    delete [] d;//删除数据加[]

    //////////////////对象类型/////////////////////

    //C
    B *e = (B*)malloc(sizeof(B));
    e->c = 100;
    printf("e->c =%d\n", e -> c);
    free(e);

    //C++
    B *f = new B(200,300);
    cout << "f->c ="<<f->c<< endl;
    delete f;
    system("pause");
    return 0;
}

malloc和delete?new和free?

这两种运算符能否混搭使用呢,比如我用malloc开辟的内存,能否使用delete回收?我用new创建的对象,能否使用free释放?答案是可以的,但是有一点,delete回收内存相对于free,多了一步执行析构函数的过程,而new创建对象相对于malloc,多了一步执行构造方法的过程

//C++的new delete和C的malloc free的区别:
//new delete的方式创建和销毁会分别执行构造函数和析构函数
//malloc free则不会执行

void func2() {
    //C++
    //Teacher *t1 = new Teacher("renzhenming");
    //cout << t1->getName() << endl;
    //释放
    //delete t1;
    //C
    Teacher* t2 = (Teacher*)malloc(sizeof(Teacher));
    t2->setName("renzhenming2");
    free(t2);
}

void main() {
    func();
    cout << "----------------------------------------------" << endl;
    //C++和C创建和回收数组
    //c
    int *p = (int*)malloc(sizeof(int) * 10);
    p[0] = 9;
    free(p);
    //c++
    int *p2 = new int[10];
    p[0] = 2;
    //释放数组
    //注意释放数组需要加[]
    delete[]p2; 
    system("pause");
}
相关文章
|
云安全 安全 网络安全
|
4天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
1864 1
|
10天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
1731 37
|
4天前
|
安全 应用服务中间件 Go
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
PHP2Shell 双 RCE 已遭在野利用:WordPress、Drupal 全在射程内,nginx 其实另有洞。拆成因与修复顺序
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
|
7天前
|
Web App开发 人工智能 前端开发
2026 年 AI 浏览器怎么选?Ego Lite、Tabbit、Chrome DevTools MCP 深度对比,开发者到底该用哪个?
2026年AI浏览器选型指南:Ego Lite专注多Agent协同(Mac优先),Tabbit国产首选,原生支持Windows与Codex控制;Chrome DevTools MCP非浏览器而是开发者利器,深度集成Console/Network/Performance调试能力,让AI真正“看懂并验证”前端代码。
1022 2
|
12天前
|
安全 Linux 芯片
【万字长文】Ollama下载、安装、配置、使用保姆级教程(2026最新图解)
Ollama 是一款免费开源的本地大模型运行工具,支持 DeepSeek、Qwen 等主流模型,一条命令即可下载运行。2026 最新版 v0.35.1 官方安装包(1.47GB)已提供国内直连下载,纯本地、离线可用、无广告、无隐私泄露风险。
1086 2
|
11天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
1342 0
|
15天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
10天前
|
人工智能 开发者
Qoder CN 大使计划正式开启|无限创造,等你一起
全年免费积分、优先内测、活动支持与更多共创机会,邀请用 Qoder 把想法变成现实的你。
673 6