PoEdu培训 C++班 第九课 复习
文章类别: 培训笔记 0 评论

PoEdu培训 C++班 第九课 复习

文章类别: 培训笔记 0 评论

复习

C Plus (非官方定义的C Plus)

bool

在C语言中, bool(_Bool) 和 int 是转换关系
C语言中, bool类型的定义为:

(!0) == true  
0 == false  

在C++中, bool 是定义的类型!

const

const是C++先有的, 然后C标准又加进去的.

// 在空间分配方面
const int i = 100;
// 根据后续操作的不同, 有可能会直接变成100, 
// 有可能是一个临时变量, 等等等等 
// const 在编译的时候, 很多变化

字面常量存储在常量区中, 属于非编译器级别的常量.

#define定义出来的一些宏 都属于 真常量

  1. const 是一个具有类型的常量, 它可以在编译时进行类型检查.
  2. const在编译时分配空间, 可以更加方便调试.
  3. 作用域方面, 宏是全局的, const是有作用域的.

建议: 使用 const 代替 #define 的常量声明

本质上, const是给程序员看的, 它的所有便利都是给程序员带来的.   
它能使 语义 更加清晰.

enum

enum 可以来定义常量

域运算符

new和delete运算符

new 和 delete 是可以被重载的

malloc 和 new 的区别

malloc不会调用构造函数
malloc是函数

函数重载

命名改编/命名粉碎

命名规则类似于:

[] 代表不一定有
[命名空间][@类名]@方法名[@参数1类型@参数2类型.....][@const]

二义性

void Foo(int num) {}
void Foo(int num, int other = 10) {}
int main()
{
    // 二义性产生了
    // 对重载函数的调用不明确
    Foo(20);
    reutrn 0;
}
void Foo(int num) {}
void Foo(unsigned int num) {}
void Foo(long num) {}
void Foo(double num) {}
int main()
{
    // 二义性产生了
    //从上往下的转换, 尝试匹配参数列表时....
    long long llVal = 20;
    Foo(llVal);
    reutrn 0;
}
void Foo(int num) {}
void Foo(float num) {}
int main()
{
    // 二义性产生了
    //从上往下的转换, 尝试匹配参数列表时....
    Foo(1.00003);
    reutrn 0;
}
void Foo(char) {}
void Foo(short) {}
void Foo(double){}
int main()
{
    // 二义性产生了
    //从上往下的转换, 尝试匹配参数列表时....
    Foo(1);
    reutrn 0;
}

解决二义性的方式:
指明调用类型

默认形参

引用

int& Foo(int& num)
{
    num = 100;
    return num;
}

int main()
{
    int num = 1;
    Foo(num);
    // 此时, num == 100
    Foo(num) = 10;
    // 此时, num == 10;
    return 0;

类型转换

inline函数

Object

类与对象

类的访问权限

类的默认权限是 private

结构体

struct StructDemo
{

int num_;

}
默认访问权限是 public 的.

类和结构体 区别在于 默认访问权限 不同.
他们都可以进行 抽象 和 封装.

C和C++

C语言有的, C++都有, 但是有区别.

Alt 类

初始化列表

一个空类默认生成的函数

注意, 后两个函数只有在使用的时候编译器才会去定义它

疑问?????
不知道有没有默认的operator*的两个版本?

运算符重载


class Demo
{
public:
    Demo(int num = 0):num_(num){}
    void Open(){};
    void Close(){};
private:
    int num_;
}

// 智能指针类
class MyPoint
{
public:
    MyPoint()
    {
        demo_ = new Demo;
    }
    ~MyPoint()
    {
        delete demo_;
    }
    Demo* operator->()
    {
        return demo_;
    }

    void* operator new(size_t size)
    {
        // demo = malloc(size); // 先分配空间
        // 在调用构造函数
    }

    void* operator new(size_t size, void* buffer)
    {
        // 不分配空间的new
    }

private:
    Demo* demo_;
}

int main()
{
    MyPoint point;
    // 直接访问
    point->Open();


    // int *p = new int(100);
    char temp[100] = {0};
    MyPoint* pPoint = new (temp) MyPoint(); // 此时分配的空间在temp里

    return 0;
}

如有错误,请提出指正!谢谢.

回复