C++学习 DAY1

:的用法

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) 正确的

函数的重载

定义两个以上的函数函数名相同,但形参的个数或类型不同。编译器会根据实参形参的个数类型进行最佳匹配,这个过程叫函数的重载。注意:编译器不以返回值类型和形参名称不同来进行重载

猜你喜欢

转载自blog.csdn.net/qq_31869107/article/details/80886606