c++ 基础语法部分

1 this指针

c++ 代码转换为c语言代码简要:
转换
注意事项:

  1. C++中this关键字是一个指向对象自己的一个常量指针,不能给this赋值;
  2. 只有成员函数才有this指针,友元函数不是类的成员函数,没有this指针;
  3. 同样静态函数也是没有this指针的,静态函数如同静态变量一样,不属于具体的哪一个对象;
  4. this指针作用域在类成员函数内部,在类外也无法获取;
  5. this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。

2 c++11 新特性

2.1 auto和decltype 类型推导

  1. 语法格式:
    auto varname = value;  //auto的语法格式
    decltype(exp) varname [= value];  //decltype的语法格式
    

    其中,varname 表示变量名,value 表示赋给变量的值,exp 表示一个表达式,方括号[ ]表示可有可无。

  2. 区别:
    auto 和 decltype 都会自动推导出变量 varname 的类型:

    • auto 根据=右边的初始值 value 推导出变量的类型;
    • decltype 根据 exp 表达式推导出变量的类型,跟=右边的 value 没有关系。
    • auto 要求变量必须初始化,也就是在定义变量的同时必须给它赋值;而 decltype 不要求,初始化与否都不影响变量的类型。因为 auto 是根据变量的初始值来推导出变量类型的,如果不初始化,变量的类型也就无法推导。

2.2 volatile 和 const 限定符

  • const 关键字用来表示数据是只读的,也就是不能被修改;
  • volatile 和 const 是相反的,它用来表示数据是可变的、易变的,目的是不让 CPU将数据缓存到寄存器,而是从原始的内存中读取。

2.3 智能指针

2.3.1 shared_ptr

2.3.1.1 shared_ptr 创建

详见网站:[shared_ptr]shared_ptr(https://zh.cppreference.com/w/cpp/memory/shared_ptr)

2.3.1.2 shard_ptr 功能

  • 多个 shared_ptr 对象可托管同一对象指针,系统会维护一个托管计数,当无shared_ptr托管该指针时,delete该指针
  • shared_ptr对象不能托管指向动态分配的数组的指针,否则程序运行出错。

2.3.2 unique_ptr

shared_ptr、unique_ptr、weaked_ptr详解

2.4 右值和move语义

  • 右值:不能取地址的表达式,不在内存中占有确定位置的表达式。
  • 左值:能取地址的表达式,在内存中占有确定位置的对象
  • 左值引用: 使用 "&" 表示
    int &b = num;
    
  • 右值引用:用 "&&" 表示
    int && a = 10;
    
  • move 语义:
    内部实现:

    // FUNCTION TEMPLATE move
    template <class _Ty>
    _NODISCARD constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movable
        return static_cast<remove_reference_t<_Ty>&&>(_Arg);
    }
    

    对象要实现转移构造函数。
    详细介绍

2.5 lambda表达式

待补充

2.6 强制类型转换

强制类型转换说明:

强制类型转换 说明
static_cast 用于基本类型之间、有继承关系的类对象之间、类指针之间的转换;
不能用于基本类型指针之间的转换
const_cast 用于去除变量的只读属性即去除const volatile属性;
强制转换的目标类型必须是指针或引用
reinterpret_cast 用于指针类型之间、整数和指针类型之间的转换,非常不安全
dynamic_cast 用于有继承关系的类指针之间、有交叉关系的类指针之间的转换;
具有类型检查的功能;
需要虚函数的支持

注意事项:

  • static_cast 不能用于无关类型之间的转换

2.6.1 static_cast

用法:static_cast <类型说明符> (变量或表达式)

它主要有如下几种用法:
(1)用于类层次结构中基类和派生类之间指针或引用的转换
+ 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
+ 进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的
(2)用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
(3)把空指针转换成目标类型的空指针
(4)把任何类型的表达式转换为void类型
注意:static_cast不能转换掉expression的const、volitale或者__unaligned属性。

static_cast:可以实现C++中内置基本数据类型之间的相互转换。

2.6.2 reinterpret_cast

在C++语言中,reinterpret_cast主要有三种强制转换用途:改变指针或引用的类型、将指针或引用转换为一个足够长度的整形、将整型转换为指针或引用类型。

用法:reinterpret_cast<type_id> (expression)
type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。
它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
在使用reinterpret_cast强制转换过程仅仅只是比特位的拷贝,因此在使用过程中需要特别谨慎!

2.6.3 dynamic_cast

用法:dynamic_cast<type_id> (expression)
(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。
(2)不能用于内置的基本数据类型的强制转换。
(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

  • B中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。
  • 这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函数的类才有虚函数表。

(5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

  • 向上转换,即为子类指针指向父类指针(一般不会出问题);向下转换,即将父类指针转化子类指针。
  • 向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。
    在C++中,编译期的类型转换有可能会在运行时出现错误,特别是涉及到类对象的指针或引用操作时,更容易产生错误。Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试。

原文链接: https://www.cnblogs.com/lihaihui1991/p/14304719.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    c++ 基础语法部分

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/400347

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月14日 下午2:05
下一篇 2023年4月14日 下午2:06

相关推荐