• C++进阶小结


    1.C++中类的不同存储区的对象的初始值

    class test;

     1 class test
     2 {
     3 private:
     4     int i;
     5     int j;
     6 public:
     7     int geti()
     8     {
     9         return i;
    10     }
    11     int getj()
    12     {
    13         return j;
    14     }
    15 };

    1.在上创建对象时,成员变量初始值为随机值

    test *p = new test;

    2.在上创建对象时,成员变量初始值为随机值

    test t;

    3.在静态存储区创建对象时,成员变量初始为0

    全部变量:test t;

    静态变量 static test t;

    2.C++类中const问题

    const对象只能调用const成员函数,const成员函数也只能调用const成员函数,类成员中const成员是只读变量,可以通过修改指针指向的值来修改

    3.类中成员函数与对象的关系

    类的每个对象都拥有一套自己的成员变量,但是成员函数仅有一套,所有的对象共用这一套函数,函数被不同对象调用的区别在于类中提供了一个this指针,该指针指向特定的对象

    4.拷贝构造函数中的const 对象为何直接调用成员private变量?

    1 class test
    2 {
    3     int i;
    4 }
    5 
    6 test(const test& t)
    7 {
    8     i=t.i;
    9 }

     我们都知道私有成员是可以通过成员函数来使用,拷贝构造函数是特殊的成员函数,所以可以直接使用privete成员

    5.类中静态变量

    公有静态变量可以被类名对象名直接调用

    私有静态变量能通过对象名调用

    静态变量能在类外初始化,因为静态变量不属于任何一个对象

    6.静态成员函数与普通成员函数的区别

    静态成员函数中没有this指针

    静态成员函数能访问静态成员函数和静态变量(类似于const)

    公有静态成员函数可以通过类名直接调用,也可以通过对象名(不分public和private),普通成员函数只能通过对象名调用,因为需要与对应的this指针相匹配

    7.函数重载

    函数名和函数参数是用来确定函数的,仅靠函数名不可以,且重载函数必须在同一作用域

    静态函数可以和普通函数构成重载(同一作用域)

    类中也可以重载函数(构造函数)

    相同的参数,不同的顺序也发生重载

    1 double fun(int i,double j)
    2 {
    3     
    4 }
    5 
    6 double fun(double j,int i)
    7 {
    8     
    9 }

    函数返回值不能做重载依据

    形参中存在const不能重载

    double fun(const int i,double j);
    
    double fun(int i,double j);

    8 汇编代码与源代码

    现代编译器会自动进行优化,导致源码的二进制代码被优化后无法区别,如前置++和后置++ ,所有无法从汇编代码获取程序源码 

    9 隐式类型转换

    short 和 char 型做运算得到的结果为 int型,而非直观上的short型,因为4字节整型运算更加高效

    10 转换构造函数

    1 class test
    2 {
    3   public:
    4           test(){}
    5     
    6           test(int i){}
    7 }

    如果存在如下代码

    test t;

    t=5;

    此时就会调用test(int i)这个函数(转换构造函数),等价于t=test(5), 类似于将int 类型转换为test类型

    可以在转换构造函数前添加 explicit 关键字来阻止编译器自动隐式转换

    注:转换构造函数只有一个参数,且该参数类型为其他类型(不能是类本身类型)

    11 类型转换函数

    类中的成员函数  operator Type() ,Type 为不同于类类型

    与转换构造函数类似

    调用方式:隐式调用

    12 子类中可以定义父类中的同名成员,但子类成员会隐藏(不等于没有)父类的成员,如果需要调用父类成员变量,需要加上父类的作用域分辨符

    13   构造函数内部是不会发生多态,在构造函数执行时,虚函数表指针未被正确初始化,只会调用当前类中的版本

      析构函数内部也不可能发生多态行为,在析构函数执行时,虚函数表指针已经被摧毁,只会调用当前类中的版本

      构造函数不能成为虚函数,因为虚函数指针未被正确初始化

      析构函数可以发生多态,既可以成为虚函数

    14 函数模板创建过程中会有两个步骤

      1.对模板本身进行编译

      2.对替换后的代码进行编译

    15 类模板特化只是模板的分开实现,本质上还是同一个类模板

    16 重定义是一个类模板和一个新类(或者两个类模板),使用的时候需要考虑如何选择的问题

      特化是以统一的方式使用类模板和特化类,编译器会优先选择特化类

    17 智能指针 #include<memory>

    auto_ptr:一个指针对象只能指向一片地址,且某一片地址只能被一个auto_ptr指针所指向,一旦发生赋值操作,内存所有权就会转换

    share_ptr指针变量可以多个共享一片内存

    unique_ptr与auto_ptr类似,但是不能转换内存所有权

     

    Qt中的智能指针:

    -------QPointer

        优点:可以多个指针指向同一片内存,但是一旦内存被释放,所有的指针全为NULL,

        缺点:析构时不会自动销毁所指向的内存

    -------QSharePointer

        它属于引用计数型指针,只有当引用计数为0时才会销毁对象

    18 关键字 typeid()

      当参数为类型名时,则返回类型名

      当参数为变量时:

        变量类型为普通类型时,则返回静态类型

        变量类型为类类型,且不含虚函数时,则返回静态类型

        变量类型为类类型,且含有虚函数时,则返回动态类型

    19 编译器选择函数顺序

      函数重载->函数模板->变参函数

    PS:持续更新

  • 相关阅读:
    SQL慢查询安装过程
    grafana + influxdb + telegraf , 构建性能监控平台
    JDK安装、java环境配置
    多源最短路Floyd 算法————matlab实现
    单源最短路Dijkstra算法——matlab实现
    Layout基本属性总结
    Scrollview中嵌套ListView(自定义组件解决)
    SQL 一列拆分多行
    C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案
    sqlserver中分区函数 partition by与 group by 区别 删除关键字段重复列
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/7290872.html
Copyright © 2020-2023  润新知