类里的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;
}
}