设为首页 加入收藏

TOP

C++入门之new和delete关键字、静态成员属性与函数、this指针使用介绍
2018-03-11 09:11:27 】 浏览:132
Tags:入门 new delete 关键字 静态 成员 属性 函数 this 指针 使用 介绍

new和delete关键字

C++中提供了new和delete关键字,new用来开辟内存,delete用来释放内存,并且new会自动调用构造函数,delete关键字会自动调用析构函数,与C语言中中malloc和free中不同的是,这个两个函数不会调用构造函数和析构函数。

当不用调用构造函数与析构函数的时候,它们的功能是一样的

    //C语言语法
    int *p = (int *)malloc(sizeof(int));
    *p = 200;
    //C++语法
    int *p2 = new int;
    *p2 = 200;
    delete p2;
    //C++语法中是分配一个内存,并且初始化
    int *p3 = new int(200);
    delete p3;

    //C语言生成一个数组
    int *pArray = (int *)malloc(sizeof(int) * 2);
    p[0] = 1;
    free(p);
    //C++语法分配一个数组
    int *pArray = new int[2];
    pArray[0] = 2;
    delete[] pArray;
    //这种写法不会调用构造函数和析构函数
    Test *pT1 = (Test *)malloc(sizeof(Test));
    free(pT1);

    //new能调用构造函数,delete能自动调用析构函数,作用都是开辟内存和释放内存
    Test *pT2 = new Test(10);
    delete pT2;

所以在C++中如果建议使用new和delete语法,因为在析构的时候,可能要附带析构其他对象,使用delete语法,能更安全。

静态成员属性与函数

如果你希望某个属性可以被所有该类对象共用,那么,你可以定义成静态成员属性,同样的,你还可以在其他类中引用到这个属性

class T{
public:
    static int a;
}
//初始化的时候,一定要在外面初始化,防止重复开辟内存
int T::a = 100;
int main(){
    cout<
  

  

  
   

如上讲述如何将一个类的属性设置成静态,你同样可以将一个函数设置成静态成员函数

#include "iostream"
using namespace std;

class T {
public:
    int c;
    static int a;
    static void test() {
        cout << "hello" << endl;
    }
};
int T::a = 1;

int main() {
    T::a = 2;
    cout << T::a << endl;
    T::test();
    system("pause");
    return 0;
}

这里通过T::test();就能直接访问该函数,但是如果你在test()方法中使用非静态成员属性或者函数的时候,编译器就会报错,例如你在test函数中使用c变量,c变量是非静态的,那么既然它的非静态的,它属于某个对象,而如果你在静态函数中引用这个对象,编译器无法识别它属于哪个对象的,除非你通过某个对象引出这个属性,对于非静态成员函数在静态成员函数中使用,也是不允许的,道理和上面一样。

this指针

在C++中,非静态成员属性,静态成员属性,非静态成员函数和静态成员函数,编译器是如何管理它们的,事实上

成员属性–存储于对象中,于struct相同

静态成员变量–存储于全局区中

成员函数–存储于代码块中

静态成员函数–存储于全局区中

通过如上写法,你可能会想到一个问题,既然成员函数并没存储在当前对象,那么我们使用这个对象调用这个函数,并给当前当前对象的成员属性赋值的时候,编译器是如何知道当前是哪个对象,我应该使用这个函数给哪个成员属性赋值呢,事实上,编译器在处理这种情况的时候,会增加一个this指针,然后通过这个指针,指向要赋值对象,再给这个对象赋值,下面用C语言模拟编译器实现面向对象的封装

struct Test{
    int i;
};
void Test_init(Test * this,int i){
    this->i = i;
}
int Test_getI(Test * this){
    return this->i;
}

void Test_Print(){
    printf("This is class Test. \n");
}

Test a;
Test_init(&a,100);
Test_getI(&a);
Test_Print();

如果将以上代码转换成C++实现

class Test{
private:
    int i;
public:
    Test(int i){
        this->i = i;
    }
    int getI(){
        return this->i;
    }
    static void print(){
        printf("This is class Test.\n");
    }
};
Test a(100);
a.getI();
Test::print();

分配使用C++和C实现你会清楚的发现,事实上,只是C++编译器帮助我们省去了this指针这个参数。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇vs2015开发人员命令提示工具 查看.. 下一篇C++ 中友元函数的使用介绍

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目