结构体和类的初始化

来源:互联网 发布:淘宝男装批发厂家直批 编辑:程序博客网 时间:2024/05/20 05:09

一.  结构体的初始化

1、若类和结构体所有数据成员均为public型,可采取如下带花括号形式进行初始化。

注意:

①不论值的个数多少,都必须使用花括号定界

②未指定值的数据成员编译器会自动初始化为默认值

③这种初始化对象方式,要求所有数据成员必须为public型

④这种初始化对象方式,要求类中不能编写任何构造函数

 struct Test{    inta;    stringb;}; Test t={1, 2};  //只有这一种初始化方式,使用花括号


2、若结构体中含有自定义的构造函数,或者含有private和protected,只可以使用自己定义的构造函数(由于在C++中结构体和类的本质是一样的,只要自己声明了结构体,就没有了默认构造函数,这一点和java中很不同)

struct Test{private:    int a;    string b;public:    Test(int aa,  string bb){           a=aa;           b=bb;    }    };//可以使用的构造方式Test  test(1,"str");Test  test = Test(1,"str");Test * test = new Test(1, "str");//如果只有一个参数:Test test=1;


二.  类的初始化

一.类的初始化和结构体的基本相同,只是没有花括号的构造方式

class Test{private:    int a;    string b;public:    Test(int aa,  string bb){           a=aa;           b=bb;    }    };//可以使用的构造方式Test  test(1,"str");Test  test = Test(1,"str");Test * test = new Test(1, "str");//如果只有一个参数:Test test=1;


二.下面介绍一下使用new和其他构造方式的区别

下面是参考别人总结的一些关于new创建类对象特点:

new创建类对象需要指针接收,一处初始化,多处使用

new创建类对象使用完需delete销毁

new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间

new对象指针用途广泛,比如作为函数返回值、函数参数等

频繁调用场合并不适合new,就像new申请和释放内存一样


1new创建类对象例子:

CTest* pTest = new CTest();

delete pTest;

pTest用来接收类对象指针。

不用new,直接使用类定义申明:

CTest mTest;

此种创建方式,使用完后不需要手动释放,该类析构函数会自动执行。而new申请的对象,

则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。

 

2、只定义类指针

这跟不用new申明对象有很大区别,类指针可以先行定义,但类指针只是个通用指针,在new之前并为该类对象分配任何内存空间。比如:

CTest* pTest = NULL;

但使用普通方式创建的类对象,在创建之初就已经分配了内存空间。而类指针,如果未经过对象初始化,则不需要delete释放。

 

Ps、我在构造一个链表,使用了while循环,由于使用的非new的构造方式而且声明为局部变量,每次都会自动回收,所以就会构造错误:

         int i=0;

         while(i<2){

                   Test p("1");

                   cout << &p <<endl;

                   i++;

         }

解决方式,将p的作用于提高一层,声明的这部分的全局变量,或者使用new来声明对象。

原创粉丝点击