C/C++ struct结构体用法总结

先看一下下面这段结构体的定义:

struct point {
    int x;
    int y;
};

这段代码在C++里面其实简单,point是一个类(class), 且由于用了struct关键字,那么x,y都是public的。然而在C里面,事情没这么简单。在C里面point只是一个tag, struct point才是一个完整的类型名称, 所以在C里面,用声明一个poin变量,需要这么写:struct point pt; 而在C++可以直接写:point pt;

在C里面想直接用类似C++的方法定义变量,需要用typedef, 比如

typedef struct point {
    int x;
    int y;
} Point;

那么就可以直接写Point pt; 了。之所以想写这个总结是因为自己在用struct的时候总是用的不伦不类,比如下面的用法就是不好的我觉得:

struct Point {
    int x;
    int y;
};
Point pt;

这段代码是定义pt是C++的用法, 涉及到类,但是定义这个类又只有两个public的成员变量,像极了纯C的struct结构体。这就有点不伦不类了,如果要从面向对象的角度,最好就还是把Point定义成class, 然后加上getX, setX, getY, setY去access还有modify成员变量,还要加一个constructor和destructor:

class Point {
public:
    Point(int vx, int vy): x(vx), y(vy) {}
    ~Point() {}

    int getX() const { return x; } //const means 'this' is constant
    int getY() const { return y; }
    void setX(int value) { x = value; }
    void setY(int value) { y = value; }

private:
    int x;
    int y;
};
Point pt;

上面的代码的风格是很好的,而且也不会不伦不类,但是就是稍微有点小题大做或者杀鸡用牛刀的感觉,为什么这么说呢,比如有时候我们其实很想方便的修改x, y,觉得直接赋值更加自然,何必调用一个函数呢,这个感觉来自于面向过程的C,如果这样, 我觉得下面这个代码也是可以接受的比较自然的一种代码(还是面向对象的思维,但是仅仅省略getter和setter而直接access成员变量):

struct Point {
    int x;
    int y;
    Point(int vx, int vy): x(vx), y(vy) {}
};

总结: C和C++里面的struct还是需要好好理解,一个是面向过程,一个是面向对象,使用的时候千万不要不伦不类。我觉得C++的面向对象的用法比较合理,C面向过程的用法还是太繁琐不够灵活,建议使用倒数第一和倒是第二种struct代码风格。

Written on January 13, 2013