C++学习笔记

2021-04-07  本文已影响0人  Space2016

1、inline 关键字

2、 通过引用变量访问对象中的成员

3、构造函数的规则

    student();
    student(int);   // 不带默认参数

4、关于释构函数的注意点

5、const关键字的作用

常对象

指向对象的常指针

指向常变量的指针变量

void doSomething1(const Test *p1)
{
p1->setX(5); //非法!
p1->printxy( );
}

| 数据成员 | 非const成员函数 | const 成员函数 |
| --- | --- || --- |
| 非const数据成员 | 可引用,可改变值 | 可引用,不可改变值
| const数据成员 | 可引用,不可改变值 | 可引用,不可改变值
| const对象数据成员 | 不可引用,不可改变值 | 不可引用,不可改变值

6、对象的赋值和复制

7、对象的复制

复制构造函数:

Object::Object(const Object& b){
    a = b.a
}

8、友元

友元函数

友元类

9、运算符重载

运算符重载的意义

运算符重载的实现方法

对象+法运算符重载
成员函数实现 
// 写法一
object object::operator+(object & obj2){
    object obj3;
    obj3.a = obj2.a;
    return obj3;
}

// 写法二
object object::operator+(object & obj2){
    // 直接调用构造函数返回
    return object(obj2.a);
}


非成员函数实现方案
object operator+(object & obj1, object & obj2){
    // 直接调用构造函数返回
    return object(obj1.a + obj2.a);
}

运算符重载的规则

成员运算符.
成员指针访问运算符.*
作用域运算符::
sizeof
条件运算符?:

10、类(继承类)访问权限

| * |public | protected | private |
| --- | --- || --- | --- |
| 同一个类 | YES | YES | YES |
| 派生类 | YES | YES | NO |
| 外部类 | YES | NO | NO |

11、匿名函数——lambda表达式

[capture list] (params list) mutable exception -> return type { function body}
各项具体含义
1. capture list 捕获外部变量列表
2. params list 形参列表
3. mutable 指示符,用于说明是否可以修改捕获的变量
4. exception 异常设定
5. return type 返回类型
6. function body 函数体

// 实例
int a0 = 1;
int b0 = 2;
auto funcs = [=, &b0](int c)->int {return b0 += a0 + c;};
int ress = funcs(6);

12、命名空间

13、有继承关系的构造函数调用

14、多态

静态多态

动态多态

动态多态性是在程序运行过程中才动态地确定操作所针对的对象,动态多态性又称运行时的多态性

15、C++类型转换

int i  = 6;
i = 7.5 + i;

const_cast

const Object obj1 = new Obejct();
Object * obj2 = static_cast<Object>(obj1);

const Person * pp1 = new Person();
//    pp1->age = 10; // error 因为是const 对象
Person * pp2 = const_cast<Person *>(pp1) ;
pp2->display();
pp2->age = 20;
pp2->display();

dynamic_cast

class Person{
    virtual do();
};
class Student:public Person {
};
class Other{
};

Person * aa = new Person();
Person * bb = new Student();

Student * stu1 = dynamic_cast<Student*>(aa);// 返回为NULL
Student * stu2 = dynamic_cast<Student*>(bb);

Other * oth1 = dynamic_cast<Other*>(stu2); // 返回为NULL

//返回为NULL 证明类型转换失败

reinterpret_cast

16、模板

template <typename\class T>
typename和class是等价的

17、智能指针

传统的指针需要手动管理内存,非常容易导致内存泄露和野指针等问题,针对这一问题,C++采用了智能指针的方案来解决。

auto_ptr

shared_ptr

unique_ptr

unique_ptr<Object>ptr1(new Object());
unique_ptr<Object>ptr2 = std::move(ptr1); //转移所有权 

make_shared

利用这个模板函数对智能指针进行初始化效率更好

//传统初始化智能指针的写法
std::shared_ptr<Widget> spw(new Widget);
//利用make_shared 函数初始化的写法
auto spw = std::make_shared<Widget>();

18、联合体

union aOBJ {
private:
    int value;
public:
    aOBJ(int value = 0){ this->value = value;};
    void say(){  std::cout << "saySomething" << value << std::endl;};
};

19、override关键字

上一篇 下一篇

猜你喜欢

热点阅读