C++知识查漏补缺

c、c++中的const

const在c中的行为是常变量
不能定义数组的大小,因为其是一个变量
在c++中,使用立即数初始化,那么就是一个常量在编译阶段,会将所有的a使用10代替(const int a = 10),使用变量初始化(const int a = b)就是一个常变量,因为b的值只有在运行阶段才能知道,其行为和在c中一致,
都可以通过 int* p = (int*)&a 修改a地址的值(需要转int*, 是因为常量不能把地址暴漏给普通指针),但是对于常量来说,在编译阶段就已经被常量替换了,因此打印出来也是不变的。

const与一二级指针:const修饰的是与其最近的类型

int const * p;//修饰的int,是底层const
const int * p;//同上,推荐这种写法

int * const p;//修饰的int*,顶层const
const int * const p;//第一个const是底层const,第二个是顶层const
int main()
{
    const int a = 10;

    
    int* p = (int*)&a;
    const int b = a;
    *p = 30;
    printf("%d %d %d",a, *p, b);

	return 0;
}

左值与右值

tip:
const 是否构成重载:
当函数的参数是值传递的const时,不构成重载,因为值传递传递的是复制的值,对实参无影响。
当指针传递,引用传递时,const构成重载,
类的成员函数被const修饰时,构成重载,因为影响了能否修改成员变量
参考:https://blog.csdn.net/qq_38408573/article/details/116061377

  • 左值 lvalue 是有标识符、可以取地址的表达式,最常见的情况有:
    变量、函数或数据成员的名字
    返回左值引用的表达式,如 ++x、x = 1、cout << ’ ’
    字符串字面量如 "hello world”
  • 在函数调用时,左值可以绑定到左值引用的参数,如 T&。一个常量只能绑定到常左值引用,如 const T&。
  • 纯右值 prvalue 是没有标识符、不可以取地址的表达式,一般也称之为“临时对象”。最常见的情况有:
    返回非引用类型的表达式,如 x++、x + 1、make_shared(42)
    除字符串字面量之外的字面量,如 42、true

在 C++11 之前,右值可以绑定到常左值引用(const lvalue reference)的参数,如const T&,但不可以绑定到非常左值引用(non-const lvalue reference),如 T&。
C++11 开始,C++ 语言里多了一种引用类型——右值引用。右值引用的形式是 T&&,比左值引用多一个 & 符号。

void fun(A&& val){}//当使用val调用函数时,匹配的是左值引用,意思是右值引用这个变量是个左值,因为这个右值引用是可以取地址的11

share_ptr<A> ptr1{new A()};
share_ptr<A> ptr2= std::move(ptr1);//等价于static_cast<share_ptr<A>&&>(ptr1)

std::move(ptr1)可以被视为xvalue 将亡值

  • 当对一个pvalue 纯右值进行绑定到右值引用时,会让一个纯右值的生命周期延长为xvalue

  • c++11以前函数返回一个本地对象的时,这个对象会被拷贝到调用此函数的栈,如果有返回值优化(NRVO)会把对象之间构造到栈上,如果返回的是std::move(a),反而会影响返回值优化

容器

  • vector的所有涉及到元素移动时,比如内存重新分配,以及insert,erase等,vector会试图将元素“移动到新区域”,但是如果元素类型没有提供一个保证不抛异常的移动构造函数,vector 通常会使用拷贝构造函数。因此,对于拷贝代价较高的自定义元素类型,我们应当定义移动构造函数,并标其为 noexcept,或只在容器中放置对象的智能指针(智能指针的移动拷贝都是noexcept的)。
  • 容器自定义比较器参考包括在类中重载比较符,自定义比较函数,自定义函数对象(传入sort时,传入的是对象,而不是结构体or类名称):https://blog.csdn.net/frostime/article/details/96726297

auto & decltype

auto 类似函数模板参数的类型推导规则

decltype(auto) a = expr;

在这里插入图片描述
类数据成员的默认初始化可以优化成如下写法

在这里插入图片描述

条件变量,信号量

c++ 11 的条件变量注意只接收unique_lock,而不是lock_guard,因为lock_guard只是在构造加锁析构解锁的简单操作,而条件变量的wait会需要释放锁,
linux的条件变量是接收普通的锁

信号量可以由一个资源计数器,一个锁,一个条件变量实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值