跳转至

类里的const数据成员

  • 静态和非静态const数据成员
  • 内部类型的构造函数
  • 编译期间类里的常量,static const

数据类型:

  • 常数据成员:

const int y; 一经赋值就不能修改。

  • 静态的常数据成员:

static const int z; 所有的对象共用的,而且只有一个。

  • 静态非常数据成员:

static int z; 不是常 也是公用的。可读写可修改。

常(const)只能初始化,初始化之后就不能修改了。

构造函数初始化列表:

const要在列表里初始化。

C++会先执行初始化列表,再进行构造函数里的赋值。

Dog::Dog(int xx, int yy) : x(xx),y(yy)
{
}

下面两个写法一样:

Int i = 12;
int j(12);//调用int的构造函数对j初始化。

只有静态常量static const才可以在类中初始化,const 不可以在类中初始化。

例:

在类中

static const int z = 100;//对的。 编译时常量 所以可以这样写

const int y = 200;//错的。 运行时分配内存,编译时没有分配内存 不能初始化。初始化列表进行初始化。

初始化:

int arr[100];
memset(arr,0,100*sizeof(int));
//for循环或者memset。 两个一样。
for(int i = 0; i < 100; i++)
  arr[i] = 0;

C++包装

1、包装int 使int可以自动的初始化

class Integer {
    int i;
public:
    Integer(int ii = 0);
    void print();
};

Integer::Integer(int ii) : i(ii){}
void Integer::print() { cout << i << ' '; }

//使用:
Integer arr[100];//会自动的初始化
arr[100].print();

2、字符串堆栈

//堆栈中放的是字符串
class StringStack {
    static const int size = 100;//数组里面有100个 指向字符串的指针
    const string* stack[size];
    int index;
public:
    StringStack();
    void push(const string *s);//push的时候是放的字符串的指针
    const string* pop();
};
//构造函数
StringStack::StringStack() : index(0)
{
    memset(stack, 0, size * sizeof(string *));
}
//Push:把一个字符串放入到堆栈里。如果堆栈满了就不能放。
void StringStack::push(const string *s)
{
    if (index < size) {
        stack[index++] = s;
    }
}
//Pop:把栈顶字符串取出来。如果堆栈空 则不能取。不是空的 则可以取字符串。
//取走之后,就没有了,栈顶位置指针指向置为空。
const string* StringStack::pop()
{
    if (index > 0) {
        const string* rv = stack[--index];
        stack[index] = 0;
        return rv;
    }
    return 0;
}


void testss() {
    //1、定义一个字符串数组
    string iceCream[] = {
        "aaaaa",
        "bbbbbb",
        "cccccccccccc",
        "dd",
        "ffhdjskalfh",
        "ffhdjskalfhfdsaf",
        "ffhdjskalfdsaffh"
    };
    //2、获取数组大小
    //整个数组大小除以第一个(数组的名称就是指向的第一个)的大小 就是数组的个数
    const int iCsz = sizeof iceCream / sizeof *iceCream;
    //3、使用自己写的字符串堆栈
    //堆栈里保存的是指针。所以放的时候是放地址。
    StringStack ss;
    for(int i=0; i<iCsz; i++)
        ss.push(&iceCream[i]);
    const string* cp;
    while ((cp == ss.pop()) != 0) {
        cout << *cp << endl;
    }
}