C++基本知识点

1. 命名空间:避免命名冲突    使用方式:    using namepace A;                A::a;

2.  static总结:        

修饰变量: 使局部变量的内存在全局区,(延长局部变量的生命周期)    

          使全局变量,不能在另外一个文件中使用extern 声明访问(缩小全局变量的作用范围)        

修饰函数: 使函数,不能在另外一个文件中使用extern 声明访问        

静态函数与变量:    静态函数中的变量,必须是静态的    

                   静态函数中的函数,必须是静态的        

c++中静态函数,静态变量属于类,可通过类名访问,也可通过对象访问                

类中,静态变量的初始化必须放在类外

注意:const与static同时修饰的变量:在类外进行初始化    

3,常对象,常函数:const    

  常对象调用常函数,   (this)    

  非常对象调用 非常函数,常函数    

  为什么常对象,不能调用非 常函数?   (非常函数的this指针)          

static 不能修饰 常函数 --  const 不能修饰静态函数    

非常对象,优先调用非常函数    

4常函数既可以被非常对象调用,又可以被常对象调用,那是不是全部都写常函数可保万无一失?              都写常函数,意味着,对象的属性就不可以自由改变了,              

  常函数中改变对象的属性值的方法,

  1,mutable修饰成员变量                                    

  2,const_cast<>(this)去除常属性        

2 当返回类型 是一个非常对象的引用的时候,只能用 非常函数了        

  常函数既可以被非常函数调用,又可以被常函数调用    

常函数调用非常函数,会出错  (参数 const this -> this 会出错)

4 const 想关见解:    

c语言中:使变量只读,不可修改(修饰指针,指针变量,一般变量)                  

可修饰参数,修饰返回值    

c++语言中:除了c中的特点,            

修饰对象            

使函数变成常函数(使this变成const)    

const修饰参数的目地:       

 1,使参数只读,不可修改(编译器提示性的限制)        

2,支持常对象作为参数(常对象不可隐式转成 非常对象)               

常对象做参数:传入的实参对象,既可以是常对象,有可以是非 常对象(隐式转换)            

非 常对象做参数:传入的实参对象,只能是非 常对象(则不支持常对象作实参)    

const可以优化效率        

const int a=10;        

cout<<a<<endl;//直接当成常量使用,不再从内存中读取数据    

5.对象创建与析构过程      

对象的创建:        

  1 为整个对象分配空间        

  2 构造基类部分(默认调用无参构造)  /或初始化列表构造       

  3 构造成员变量(初始化)           /或初始化列表构造        

  4 执行构造函数中的代码 (构造函数体{}中,不是成员变量初始化的地方)    

析构:1 执行析构函数中的代码          

     2 销毁(析构)成员变量          

     3 析构基类部分    

6.必须使用初始化列表的情况  

    1const 成员变量

    2引用类型的变量 

    3继承关系的类,想以有参构造函数构造基类的时候 

   注意:const与static同时修饰的变量:在类外进行初始化

7.必须显示 使用this的情况    

  1形式参数,和成员变量名字相同时,(形式参数会隐藏成员变量)    

  2想在常函数中,对成员变量重新赋值时(去掉this的const属性)    

  3在类中的成员函数中想返回尚未创建的对象或对象的指针时    

  4在类中,把尚未创建对象作为参数,传给另一个函数 (教师,学生类间的信息通信)    

8.this的类型,和实际指向的对象没关系,和当前this所在的类有关    

    class A{        

        void foo(){            

            bar();//this.bar();编译时,静态绑定本类的bar函数        

        }        

        void bar(){}    

    }    

    class B:public A{        

        void bar(){}    

    }  

    int main(){ 

     A a=new B;    

     a.foo();

    }

9.动态绑定:(运行时绑定)    

     A   

     B:A    

     A* a = new B;   

     虚函数表的指针,存在B对象中 (虚函数,对象的类型信息等)        

优点:多态,动态绑定,基类指向子类,相同的调用,根据实际对象的不同,可以灵活执行不同的动作。                                        (相同的行为,不同的表现)

缺点:(多占内存,速度降低)    

虚函表的指针,指向的一系列 虚函数数组  (多占内存)    

执行是动态绑定,多了一些步骤(确认类型,匹配虚函数,找地址)    

虚函数,不能内联,由于编译期不绑定具体函数 (不能内联优化速度)

使用建议:(是否需要虚函数,是否需要写继承)    

要使用多态效果的时候,考虑虚函数,其他的不考虑    

使用多态效果的时候,考虑继承,其他的使用组合关系    

10.面向对象的三大特征   

 封装:私有对象的属性,不让外界直接访问(对象可以在类内部直接访问私有属性)                 protect/public 友元函数/友元类 (只是能让类外的对象访问类的私有属性)    

  继承:可以使用父类的属性和方法    

  多态(重写):基类指向不同的子对象,相同的行为,会有不同的表现(实际子对象的表现)    

重写/覆盖:override(父子类-不同作用域)    

重载:overload(同一作用域)    

隐藏:(不同作用域)

12,缺省参数    

注意事项:重载匹配时,如果既可以调用缺省函数,又可以调用一个非缺省的函数,就引起编译错误        

13,时间函数    

time_t time(time_t* t)//参数为0,可获得一个秒数(系统时间-1970-1-1 0:0:0)    

struct tm* localtime(const time_t*)//可以获得时间结构体        

tm_year=(系统时间的年-1900)//        

tm_month=(系统时间的月+1)

14,单例模式    

饿汉式,懒汉式

饿汉式:类加载时,直接构造了一个静态栈对象,每次调用静态函数时,都返回这个静态对象的引用

懒汉式:类加载时,只构造了一个静态指针,当需要创建一个对象时,  才调用一个静态函数创建一个对象,也返回这个对象的引用, 以后再调用这个静态函数,就不再创建新对象,只返回第一个对象的引用    

懒汉式存在线程安全问题

15异常:    try{}catch(exception ){}多层catch时,子类要放在基类的前面发生异常时,跳到有花括号{,会自动调用catch到的异常类的析构函数

16 钻石继承:     A                       

                B   C                          

                  D    

B:virtual public A虚表:当前地址的偏移地址和虚函数表:

17    构造函数:创建新对象        

拷贝构造:根据旧对象,创建新对象       

拷贝赋值:用一个对象,给另一个对象赋值

18 参数传递方式比较:引用,指针,值传递        

引用,指针 vs 值传递:        

    引用和指针不会建立建立对象的副本,不会引起拷贝构造出一个新对象,        

引用vs指针    

    引用比指针使用方便,    

    运算符重载的时候,返回引用比返回指针,书写的形式上更加流畅。


版权声明:本文为u012088779原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。