c++细节--section1

1.register声明的变量为寄存器变量,因此没有地址,不能对它取地址操作。

2.【用错sizeof】当数组作为函数参数传递时,数组会退化为同类型的指针。

3.每个成员在成员初始化列表中只能出现一次,初始化的顺序不是由名字在初始化列表中的顺序决定,而是由成员在类中被声明的顺序决定。

/******************point.h****************/
class point
{
private:
int xPos;
int yPos;
public:
point(int x):xPos(x),yPos(xPos)
{}
void print()
{
cout<<"xPos: "<<xPos<<", yPos"<<yPos<<endl;
}
}
/**********************main.c***************/
#include "point.h"
int main()
{
point pt1();
pt1.print();
return ;
}

输出结果如下:

xPos:  3,  yPos:  -858993460

从结果来看,yPos没有像预期初始为3,这是因为yPos排在xPos前面,因此“yPos(xPos)”先被执行,“xPos(x)”后被执行。

4.默认复制构造函数带来的问题

当复制成员涉及动态内存时,复制的两个对象中变量都指向了同一个内存块,可是,两个指针对象撤销有先后,一旦一个对象被撤销,另一个便成了“野指针”,使用该指针再次释放同一动态内存单元会引发内存错误。解决方法是:显示定义复制构造函数(为新对象开辟新的动态内存);

5.const和引用型数据成员只能通过成员初始化表达式进行初始化。

class point
{
private:
const int xPos;
const int yPos;
public:
/*
point(int x,int y) //错误!!无法直接复制
{
xPos = x;
yPos = y;
}
*/
point(int x,int y):xPos(x),yPos(y) //const数据成员只能在初始化列表中初始化
{
}
...
}

6.const与成员函数

类型  函数名(参数列表)  const
{
函数体
}

const成员函数表示该成员函数只能读取类数据成员,而不能修改类数据成员。

const对象只能被创建,撤销以及只读访问,不能改写。

上一篇:1. centos下安装docker


下一篇:LA 5846 (计数) Neon Sign