我之前就开始学习c++了,不过学到后面发现c++的规则实在太繁杂了,索性在博客上写下一些难点,以供之后我的学习参考,也希望能给别人一些帮助。
1.名称空间
在初学者的程序中经常看到这句代码
using namespace std;
std是一个包含许多基本函数的库(比如cout;cin等),当然其他你包含的库里万一也有这相同名字的函数怎么办?
比如一个work()函数在A和B这两个库都有,就要写成这样,
A::work();
B::WORK();
所以如果不写之前我们第一次提到的代码的话你要调用cout这个函数,就要写成
std::cout<<'Hello,world'<<std::endl;
这看上去麻烦的不行,但是我们可以利用名称空间,将std名称空间里的所有名称都可用。
cout<<'Hello,world'<<endl;
这样就方便多了,但是注意的是在大工程中这显然是一个潜在的问题,如果想单单存入几个函数到名称空间里,可以这样做:
using std::cout;
using std::endl;
这样就能确保单单你想用的函数,前提是没有重名。
2.注意!字符串!
c++11新增了一种原始类型(raw)字符串,具体如下:
cout<<R"+*(lalala,\n,(\t).)+*"<<endl;
显示为: lalala,/n,(/t).
这就是raw类型字符串的神奇之处,它可以无视任何\的魔法,它就是一个把原本的字符串打印出来的东西。
注意要以R"+*(................)+*"的格式。
3.结构体和共用体的使用!
struct animal
{
int age;
char[20] name;
bool sex;
}
这是一个结构体,我们怎么使用它呢?
animal dog[2]=
{
{1,'a',0},
{2,'b',1}
};
这样就新建了实体,如何访问呢?
cout<<dog[0].name<<endl;
这样就OK了,如果是指针就用 -> ,不用 . 。
再来说说共用体(union),比如说有的商品的ID是整数,而其他的是字符串,而且每个物品ID只有一个,那我们可以用union
来构建这样保存可以不同数据但只能保存一种的数据格式
struct good
{
bool type;
union
{
long id_num;
char id_name[20];
}
id_val;//省略了就为匿名共用体
};
good pen=.
{
...........
}
if (type==1)
cout<<pen.id_val.id_num<<endl;
else
cout<<pen.id_val.id_name<<endl;
//如果为匿名共用体则变为:
//cout<<pen.idname<<endl;
4.指针和new和delete的快乐生活
说实话指针可以说是c++的核心了,它真的很诱人。
int* p=new int;
char* pc=new char[20];
delete []pc;
delete p;
p是指向int型的指针,而pc是指向char数组的指针,我们可以new出来也可以delete掉,对内存的管理十分舒服,注意不要只new不delete,这样会造成内存泄漏!(见《c++ Primer Plus》P117)
我们改怎么用呢?数组指针其实就是数组名,这个指针指向数组的第0个元素,不过两者还是有区别的,比如在sizeof时,对数组名是计算出整个数组的大小,而对数组指针而言,sizeof只计算单个它指向的类型的大小。
cout<<pc[1]<<endl;
这样就是打印出来pc指向的数组的第二个元素,对这个指针也可以进行加减法,例如pc++,这pc加上一个char大小的地址。这时候的pc[1]就变成了数组的第三个元素。