C++规范与补充
1.初始化的规范写法
2.常量函数
const
变量只能调用const
函数,所以在类内最好把一些函数设置成const
函数,写法如下,普通变量也可调用const
函数,这样可以提高代码的鲁棒性。
const complex c(2, 1); // 定义常量变量
c.real(); // 若 real() 函数不加以const修饰,则编译时会报错: error: passing 'const complex' as 'this' argument
在自定义函数中如果传入的变量是const
类型,那么函数中该变量只能调用const
函数
3.传参尽量传引用
为了提高效率,使用引用传递参数,避免了参数的复制.若不希望在函数体内对输入参数进行修改,使用const
修饰输入参数。
4.同一个类的对象互为友元
同一类的各个对象互为友元,因此在类定义内可以访问其他对象的私有变量
complex c1, c2;
c2.func(c1); // 因为c1和c2互为友元,因此c2可以在func()函数内调用c1的私有变量
5.操作符的重载
5.1 <<的重载
在进行操作符重载时需要标明为友元。
以输出符号为例,因为要考虑串行输出,故返回值应该是ostream
型变量的引用。
在类内声明如下:
friend ostream & operator << (ostream & os ,const complex & p);
在类外编写实现:
ostream & operator << (ostream & os ,const complex & p)
{
os<<p.re<<'+'<<p.im;
return os;
}
当然,在不需要串行输出时,也可以令函数的返回值类型为空。
事实上,os
变量在进行操作时本身已经发生了变化(抽象理解)
5.2 +的重载
以运算符号为例:
在类内声明如下:
complex operator + (const complex &b) const
{
return complex(this->real+b.real,this->image+b.image);
}
此时返回值不可是comlpex &
引用类型,因为临时变量当函数结束时就被销毁,而引用本质是指针,无法对销毁的变量寻址。
5.3 重载作为成员函数与非成员函数
5.3.1作为成员函数时的写法
作为成员函数时,其中一个操作数会通过this
指针传递,故只需要写入一个参数。
complex operator + (const complex &b) const
{
return complex(this->real+b.real,this->image+b.image);
}
5.3.2作为非成员函数时的写法
作为非成员函数时,需要写入两个参数。
complex operator + (const complex &a,const complex &b) const
{
return complex(a.real+b.real,a.image+b.image);
}
6.指针
const char *ptr
char * const ptr
第一行const
先与char
结合,定义一个指向char类型常量
的指针ptr
,也叫常量指针(指向常量的指针),可以修改ptr
的指向,但不能修改*ptr
的值。
第二行const
先与*
结合,定义一个指向char类型的指针常量
(指针型的常量),即const
指针,不能修改ptr
指针的指向,但是可以修改*ptr
。
7.字符串相关
7.1 C风格字符串
字符串实际上是使用 null 字符 ‘\0’
终止的一维字符数组。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
上述字符串的实际储存空间为6个字符,比储存的字符数量多1,因为要以‘\0’
结尾。初始化时,也可以采用下面的方式,此时会自动补上结尾的‘\0’
。
char greeting[] = "Hello";
此外,也可以用如下的方式初始化。
char * a="string1";
char b[]="string2";
二者的不同点
1.char是变量,值可以改变, char[]是常量,值不能改变!
a是一个char型指针变量,其值(指向)可以改变;
b是一个char型数组的名字,也是该数组首元素的地址,是常量,其值不可以改变。
2.char[]
对应的内存区域总是可写,char*
指向的区域有时可写,有时只读。
参考的大佬博客
解释: a指向的是一个字符串常量,即指向的内存区域只读。b始终指向他所代表的数组在内存中的位置,始终可写!
VS2019无法用char型指针指向const型字符串解决方案传送门
7.2 C风格字符串相关函数
函数名称 | 功能 |
---|---|
strcpy(s1,s2) | 复制字符串 s2 到字符串 s1 |
strlen(s1) | 返回字符串 s1 的长度 |
strcat(s1,s2) | 连接字符串 s2 到字符串 s1 的末尾 |
… | … |
以上函数传入地址或者字符串名称即可。
char* a ;
char* b = "strin";
cout<<strlen(a)<<endl;
strcpy(a,b);
cout<<a<<endl;
注:当a与b一样被初始化为const
类型以后用strcpy
拷贝会报错,因为const
变量不许被修改。同理strcat
也不可处理const
型字符串