美文网首页c++学习笔记
c++学习笔记之基础篇

c++学习笔记之基础篇

作者: chzphoenix | 来源:发表于2017-10-17 16:56 被阅读23次

    c++学习笔记系列:http://blog.csdn.net/column/details/17301.html

    这个系列整理了一下学习c++的知识点,本篇简单提及一些基础的东西,涉及到一些具体的知识后面的篇章会细说。

    1、基本类型取值范围
    在c++中,int、long、double、short、float等的取值范围不是固定的,是与系统有关的,与Java不同。

    2、引用参数:
    在参数类型后面加&即可,如:
    int &count
    引用参数与原参数指向同一地址,是原参数的别名而已。与传值参数的区别:
    int m = n;
    int &m = n;
    第一条是值参数,将n的值赋予m,m和n没有关系。
    第二条是引用参数,将n的引用赋予m,m只是n的别名,当n或m值改变时另外一个也会跟着改变

    3、防止“==”和“=”混淆
    在c++中,如果“==”和“=”使用错误(如该使用“==”的地方使用了“=”),由于c++和Java不同,很多时候并不报错。比如在if判断语句中
    if(n = 1)
    并不会报错(在Java中就会报错),因为c++中任何非零值都当成true。
    为了防止混淆,在“==”语句中一般将变量放在右边,如:
    7==n
    这样的话当写错成“7=n”的时候编辑器就会报错。

    4、默认实参
    默认实参:函数的某个参数不经常使用,可以给函数形参一个默认值,在调用该函数时可以忽略这个参数。
    默认实参必须是函数参数列表最靠右边的参数。当调用具有多个默认实参的函数时,如果省略的实参不是形参列表中最靠右的参数,那么该实参右边的所有参数也必须被省略。如:
    函数原型
    int volume(int length = 1, int width = 1, int height = 1);
    调用
    volume()
    volume(10)
    volume(10, 8)
    volume(10, 8, 2)
    都是可以的。

    5、一元作用域和二元作用域
    作用域运算符(::)
    当局部变量和全局变量有相同名字时,用一元作用域分辨运算符来区分。
    在局部变量的作用域中,直接使用变量则使用的是局部变量,而加上(::)来使用变量则使用的是全局变量,如:

    int number = 10;  
    void get(){  
         int number = 1;  
         number = 2;         //这时是给局部变量number赋值  
         ::number = 3;       //这时是给全局变量number赋值  
    }  
    

    当局部变量和类作用域变量有相同名字时,用二元作用域分辨运算符来区分。
    与上面类似,加上(类型::)来使用变量是类作用域变量。

    注意区分类作用域变量和全局变量,全局变量不在类内部。


    6、重载与默认参数
    当函数有默认参数时,重载时要格外注意,防止出现二义性。如:
    函数原型

    int volume(int length = 1, int width = 1, int height = 1);
    重载函数
    int volume(int length, int width)
    这样的话当调用volume(2, 3)时编译器就不知道选择哪个函数。


    7、函数模板
    所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。
    凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
    类似java中的泛型。详细见:http://blog.csdn.net/chzphoenix/article/details/78257974
    定义函数模板的一般形式为:template <typename T>或者template <class T>
    例如:
    template<typename T>
    T n_add(T a,T b){}
    可以替代:
    int n_add(int a,int b)
    double n_add(double a,double b)
    等函数,不必重复定义这么多函数了。

    8、求值顺序
    c++中没有指定大多数运算符其操作数的求值顺序。只明确指定了“&&”、“||”、“,”、“?:”这四种运算符的操作数的求值顺序。
    所以不能直接认为操作数的顺序是从左向右的,不同的编译器可能顺序不同。
    如:

    int c;  
    int a(){  
         return c + 2;  
    }  
    int b(){  
         return c++;  
    }  
    a() + b();  
    

    不能直接认为a()一定在b()前运算,所以在做改变了操作数中自身值得运算一定要格外小心。

    9、常量的声明和赋值
    使用const限定符声明一个常量变量,常量变量必须在声明时用一个常量表达式来初始化,而且之后不能修改。
    声明常量是没有赋值,是一个编译错误。
    在可执行语句中给常量变量赋值也是一个编译错误。

    10、setfill
    填充指定字符,是粘性的。所以一条语句中setfill后面的都会进行填充。
    注意:因为是粘性的,所以setfill之后如果不再需要填充一定要恢复。


    11、拷贝构造函数
    必须以引用的形式接收参数,而非值,否则会无穷递归。
    因为如果是值的形式,在调用拷贝构造函数时,会传一份拷贝,这样又调用了拷贝函数,产生了无限递归。

    12、虚悬指针
    如果两个对象都指向同一内存,一个对象回收时析构函数会删除这块内存的分配。另外一个对象就变成了虚悬指针,会引起运行错误。


    13、函数返回局部变量

    返回局部变量引用或指针是常见的错误,因为局部变量在函数完成就回收了。

    相关文章

      网友评论

        本文标题:c++学习笔记之基础篇

        本文链接:https://www.haomeiwen.com/subject/vmwduxtx.html