:的用法
1.表示机构内位域的定义(即该变量占几个字节)
typdef struct _XXX
{
unsigned char a:4;
unsigned char b;
};XXX
2.构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。
typdef struct _XXX
{
_XXX():y(0x40){}
};XXX
3.public:和private:后面的冒号,表示后面定义的所有成员都是公有或私有的,直到下一个"public:”或"private:”出现为止。"private:"为默认处理。
4.类名冒号后面的是用来定义类的继承。
class 派生类名 : 继承方式 基类名
{
派生类的成员
};
::的用法
(1)表示“域操作符”
例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成void A::f(),表示这个f()函数是类A的成员函数。
(2)直接用在全局函数前,表示是全局函数
例:在VC里,你可以在调用API 函数里,在API函数名前加::
(3)表示引用成员函数及变量,作用域成员运算符
例:System::Math::Sqrt() 相当于System.Math.Sqrt()
C++的引用
区别于C,C++除了可以通过按值传递的方式传递值,也可以通过引用的方式传递。这样做的好处是避免复制大量数据的开销,可以提高性能。
#include<iostream>
using namespace :: std;
int main()
{
int One=0;
int& Two;
cout<<One<<endl;
cout<<Two<<endl;
Two=5;
cout<<One<<endl;
cout<<Two<<endl;
cout<<&One<<endl;
cout<<&Two<<endl;
return 0;
}
输出结果是:
0
0
5
5
0x7ffdaaebb85c
0x7ffdaaebb85c
从结果我们可以看出通过引用传递的Two相当于One的别名,并且他们的地址是一样的。这和linux文件操作的硬连接概念类似。
引用与指针的差别
1.指针是个变量,可以把它再赋值指向别的地址。而建立引用时必须初始化,并且根据上面的代码结果我们知道它不可以再变化。
当然也有特例:
int* a=NULL;
int* &b=a; //引用,也就是b是a的别名,本质为指针
int c=7;
b=&c;
2.反过来引用有些方式是不合法的:上面为指针的引用是合法的,但引用的指针使不合法的;引用没有void型;没有数组引用。
内联函数(inline)
C++的inline函数可以减少函数调用成本。在一个函数前面加上inline则在下次调用该函数时编译时会将该函数扩展成代码,防止多次调用该函数而造成的浪费。但内联函数里不能包含有switch、while等判断和递归中调用,编辑器会自动排除相关调用变成普通函数。因此内联函数只能是简单的函数并且是被调用频繁的函数。
内联函数与宏定义的区别:宏定义只是简单替换而内联函数编辑器会自动检查错误。
默认参数的函数
int sum(int a=4,int b=5,int c=6)
{
cout<<(a+b+c)<<endl;
return 0;
}
int main()
{
sum();
sum(1,2);
sum(1,2,3);
return 0;
}
结果分别为15,9,6
注意定义默认参数的函数要从右往左定义
sum(int a=4,int b,int c=6) 错误的
sum(int a,int b=5,int c=6) 正确的
函数的重载
定义两个以上的函数函数名相同,但形参的个数或类型不同。编译器会根据实参形参的个数类型进行最佳匹配,这个过程叫函数的重载。注意:编译器不以返回值类型和形参名称不同来进行重载