函数 Tips2

来源:互联网 发布:湖北学历网络教育 编辑:程序博客网 时间:2024/05/16 17:42

1. const修饰的需要类型转换的引用,由于是const的引用,先创建一个int类型的临时变量,然后被引用给cs。

......

    short s = 12;
    const int &cs = s;  //a temporary variable of int type will be created, as int temp = 12, so cs is a reference to tmep.
    cout<<cs<<'/n';    //cs = 12, temp = 12
    cout<<++s<<endl;  //s = 13, temp = 12
    cout<<cs<<'/n';       //cs = 12, temp = 12

........

 

error:不带const的引用,类型要精确匹配。

short s = 12;

int &cs = s;  //error

 

2. 内嵌友元,需要把friend 声明和定义分开来写,否则,将会无视friend关键字。

class out

{

friend inner;

class inner

{

.......

};

};

 

3. C++中使用inline函数来代替预处理器宏,应为宏是C使用的,没有类的概念,同时不会进行类型检查和类型转换,inline的函数声明和定义要在一起,否则将被视为普通函数,inline关键字被忽略,inline函数是真正的函数会对形参和返回值的类型进行验证。iinline函数一般会包含在头文件中,只要同名的inline函数定义体相同,就不会出现duplicate define的错误。

在类定义体内部定义的函数--包括构造和虚构函数,被认为是inline函数,所以如果定义体内容很大的函数要注意使用inline是否合适。

C++规定,只有在类声明结束后,inline函数才能被调用,这就是说,类中的inline函数可以调用调用一个还没有被声明的该类中的成员函数。

 

4. #define 宏,字符串定义符(#)和标志粘贴符(##)的使用。

#define PRINT(x)  cout<< #x"="<< x##qq << x <<endl
#define POSTVAR(x)  int pvar##x
#define PREVAR(x)  int x##pvar

 

    string str = "Hello";
    string strqq = "baibai";
    PRINT(str);
    PREVAR(str) = 10;
    POSTVAR(str) = 100;
    cout << "strpvar = " << strpvar <<endl;
    cout << "pvarstr = " << pvarstr <<endl;

结果:

str=baibaiHello
strpvar = 10
pvarstr = 100

 

5. 全局静态对象的构造函数在进入main函数之前执行,析构函数在推出main函数之后执行。

 

6. 通常放在头文件中的名字,如常量,inline函数,C++中默认都是内连接的,这样连接过程中不会发生名字冲突的问题,注意,链接只引用那些在链接/装载期间有地址的成员,像类声明和局部对象是不会被链接的。

 

7. 对于函数(非成员函数),static和extern只是改变了函数的可见性,extern和默认的可见性是一样的,static使函数成为file scope。

对于全局的变量extern是外连接,static是内连接。对于局部变量,extern表示使用其他地方声明的变量,static不改变可见性。

 

8.

class Inner{};

 

class Base
{
    static const int array1[] ;
    static const long lvar = 100;

    static const Inner objectInner;
    //static const float fvar = 10.0;  //error C2864: 'Base::fvar' : only static const integral data members can be initialized within a class
    //using namespace gaoqian; //error C2059: syntax error : 'namespace'
    //using gaoqian :: a;    //error C2886: 'gaoqian::a' : symbol cannot be used in a member using-declaration
    string getValue()
    {
        return "Base scope";
    }
};
const int Base :: array1[] = {1,2,2};
const Inner Base :: objectInner;

static属性的非integral 和非const 和array和class的对象,需要在类外面初始化定义。只有static const integral类型才能在class内部初始化。static 可以在嵌套类中声明,但是不能在局部类中声明--函数体中声明的类。因为你没有办法定义函数中的类的静态成员变量。

因为静态成员函数没有this指针,所以静态成员函数不能使用非静态成员变量和非静态成员函数。非静态成员函数则没关系