C++ 新经典 阅读笔记

一: C 语言基础
1,变量的存储:静态存储方式,动态存储方式

程序代码区、静态存储区、动态存储区

2,指针数组和数组指针

指针数组:int *p[10];
是一个有10个元素的数组,每个元素都是一个指针,所以就相当于定义了10个指针;既p[0]~p[9]
数组指针: int (*p)[10];
是一个指针,名字为p;这个指针变量用来指向含有10个元素的一维数组。

二: C++ 语言基础
1,关键字

constexpr 关键字:这是C++11引人的关键字,代表一个常量的概念,意思是在编译的时候求值,所以能
够提升运行时的性能.编译阶段就知道值也会带来其他好处,例如更利于做一些系统优化工作等。可以看做是一种更严格的内联函数,自带inline属性。

nullptr : 这是C++ 11引入的新关键字,代表“空指针”。对于指针的初始化,能用nullptr 的全部用nullptr。
const char * 、char const * 与char * const三者的区别:
“const char *p” 等价于 “char const *p” ,p指向的内容不能通过p 来修改;
“char * const p ”,p不可以再指向其他内容。

** attribute() ** : 函数用于设置动态链接库中函数的可见性,将变量或函数设置为default,则该符号可在其他动态链接库中可见;将变量或函数设置为hidden,则该符号仅在本动态链接库中可见,在其他库中不可见。

vector 类型:
是一个标准库的类型,代表一个容器、集合或者动态数组的概念。
把一堆相同类型的类对象放到vector容器中。 #include <vector>
例:vector <int> seem; 定义了一个int类型的seem 容器;引用不是一个对象,不能成为容器类型。

迭代器:
遍历容器内元素的数据类型。类似一种指针的作用
例:
vector <int> iv = {100,200,300}; //定义了一个iv 容器
vector <int> ::iterator iter; // 定义了一个iter变量(vector容器迭代器),是以 vector<int> 开头
iter = iv.begin(); //返回容器中第一个元素,代表iv[0];rbegin 反向迭代器
iter = iv.end(); //返回容器中末端元素后面一个元素;rend 反向迭代器
*iter 返回迭代器 iter 所指向元素的引用

const_iterator: 常量迭代器 ;像常量指针,表示该迭代器指向的元素的值不能改变,该迭代器是可以不断地指向容器中的下一个元素的。 cbegin、cend 返回的都是常量迭代器。
**explicit:**只对有一个参数的类构造函数有效,防止类构造函数的隐式自动转换。

构造函数初始化列表:
Time::Time(int tmphour, int tmpmin, int tmpsec) : Hour(tmphour),Minute(tmpmin)
// 把构造函数 传进来的 tmphour 附给Hour … 推荐此种初始化写法,效率更高

override / final:
override 这个关键字主要用来说明派生类中的虚函数,用了这个关键字后,编译器就会认为子类中的虚函数覆盖了父类中同名的虚成员函数,编译器就会在父类中找同名同参成员函数,如果没找到,编译器就会报错。
final 和override 相对,用在函数声明末尾,那任何在子类中尝试覆盖该成员函数的操作都将引发错误。

含有纯虚函数的类叫抽象类;抽象类不能用来生成对象,主要当做父类用来生成子类。
普通函数(非成员函数)末尾不能加const:因为const 在函数末尾意思是“成员函数不会修改该对象里面任何成员变量值”,普通函数没有对象这个概念;const 成员函数,可以被const对象或者非const对象调用;非const成员函数不能被const对象调用,只能被非const对象调用。

多态性: 只针对虚函数,非虚函数不存在多态。

友元关系的三个特性: 不能被子类继承;单向的;没有传递性。
dynamic_cast: 运算符能将父类指针或者引用安全地转换为子类的指针或者引用
typeid: typeid(类型)、typeid(表达式) 获取到对象的类型信息,会返回一个常量对象的引用。为了比较两个指针是否指向同一种类型。
右值引用: int && refrightvalue = 3; refrightvalue = 5; // 可以修改值,右值引用表示所引用对象的值在使用之后就无须保留了。C++11 新标准中的概念;

  • 在有必要的情况下,尽量考虑给类添加移动构造函数和移动赋值运算符,达到减少拷贝构造函数和拷贝赋值运算符调用的目的,尤其是需要频繁调用拷贝构造函数和拷贝赋值运算符的场合。
A(A&& tmpa) noexcept:m_pb(tmpa.m_pb)
{
	tmpa.m_pb = nullptr;
	cout << "类 A 的移动构造函数执行" << endl;
}
A a = getA();
A a2(std::move(a));

using 关键字: 让某个名字在当前作用域内可见;

class B:public A
{
private:
    /* data */
public:
    using A::A;     //B(int i,int j,int k):A(i,j,k){};
    B(int i,int j,int k):A(i,j,k){};
    // ~B();
};
2,模板与泛型

模板机制,允许在定义类、函数时将类型作为参数。

template <typename T>    //typename  主要用来表明“其后面跟的是一个类型”  也可以用class 代替
T func(T a,T b)
{
	T add = a + b;
	return add;
}

typename 第二种用法:通知编译器,某个名字代表的是一个类型。

template <typename T>
typename myvector<T>::myiterator myvector<T>::mybegin()  //表明myvector<T>::myiterator 是一个类型
{
	//......
}

多个.cpp 文件公用函数模板时,防止模板被多个.cpp文件实例化出来相同的类模板,造成额外的开销;通过 “显式实例化” 来避免:

template A <float>;    // 实例化定义,只有一个 .cpp 文件里这样写,编译器为其生成代码
extern template A <float>;    //其他所有.cpp 文件声明模板类已经实例化
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值