跳至主要內容

对象的组织

张威大约 4 分钟c/c++类和对象

对象的组织

有了自己定义的类,或者使用别人定义好的类创建对象,其机制与使用int等创建普通变量几乎完全一致,同样可以创建const对象、创建指向对象的指针、创建对象数组,还可使用new和delete等创建动态对象。

const对象

类对象也可以声明为const对象,一般来说,能作用于const对象的成员函数除了和**,便只有**了,因为const对象只能被以及

const Point pt(1, 2);
pt.print();

指向对象的指针

对象占据一定的内存空间,, C++ 程序中采用如下形式声明指向对象的指针:

类名 *指针名 [=初始化表达式];

初始化表达式是可选的,既可以通过取地址(&对象名)给指针初始化,也可以通过申请动态内存给指针初始化,或者干脆不初始化(比如置为nullptr),在程序中再对该指针赋值指针中存储的是对象所占内存空间的****。针对上述定义,则下列形式都是合法的:

Point pt(1, 2);                 
Point *p1 = nullptr;
Point *p2 = &pt;
Point *p3 = new Point(3, 4);
Point *p4 = new Point[5];
p3->print();//合法
(*p3).print();//合法

对象数组

对象数组,也有声明、初始化和使用3个步骤

对象数组的声明:

类名 数组名[对象个数];

这种格式

对象数组的初始化:可以在声明时进行初始化。

Point pts[2] = {Point(1, 2), Point(3, 4)};
Point pts[] = {Point(1, 2), Point(3, 4)};
Point pts[5] = {Point(1, 2), Point(3, 4)};
//或者
Point pts[2] = {{1, 2}, {3, 4}};//这里需要注意,除了去掉Point,还换了大括号
Point pts[] = {{1, 2}, {3, 4}};
Point pts[5] = {{1, 2}, {3, 4}};  

堆对象

,可以用new和delete表达式为对象分配动态存储区,在复制构造函数一节中已经介绍了为类内的指针成员分配动态内存的相关范例,这里主要讨论如何为对象和对象数组动态分配内存。如:
void test()
{
    Point *pt1 = new Point(11, 12);
    pt1->print();
    delete pt1;
    pt1 = nullptr;
    
    Point * pt2 = new Point[5]();//注意
    pt2->print();
    (pt2 + 1)->print();
    
    delete [] pt2;//可以试试使用free去进行释放会发生什么?为什么会发生这个问题?
}

注意: 使用new表达式为对象数组分配动态空间时,,因此,对象要么没有定义任何形式的构造函数(由),要么显式定义了一个(且只能有一个)

#include <iostream>

using std::cout;
using std::endl;

class Point
{
public:
    Point(int ix = 0, int iy = 0)
    : _ix(ix)
    , _iy(iy)
    {
        cout << "Point(int = 0, int = 0)" << endl;
    }

    void print()
    {
        cout << "(" << this->_ix 
            << ", "  << this->_iy 
            << ")" <<  endl;
    }

    ~Point()
    {
        cout << "~Point()" << endl;
    }
private:
    int _ix;
    int _iy;
};

void test()
{
    //int number = 10;
    //int *pInt = &number;
    
    Point pt(1, 2);
    Point *ptr = &pt;

    //int *pInt = new int(10);
    Point *pc = new Point(1, 3);
}

void test2()
{
    //int arr[2] = {1, 2};
    Point pt[2] = {Point(1, 2), Point(2, 3)};
    pt[0].print();


    cout << endl;
    //逗号表达式
    /* Point ptemp[2] = {(1, 2), (4, 3)}; */
    Point ptemp[2] = {{1, 2}, {4, 3}};
    ptemp[0].print();
}

void test3()
{
    int *pInt = new int[5]();

    Point *pArr =  new Point[5]();
    cout << "222" << endl;
    pArr[0] = {1, 3};
    cout << "333" << endl;
    pArr[1] = Point(2, 4);//临时对象/匿名对象,生命周期只在本行,对象在本行创建,也在本行销毁
    cout << "111" << endl;

    delete [] pArr;//堆对象数组
    /* free(pArr);//error */
}

int main(int argc, char **argv)
{
    test3();

    return 0;
}