C++ Primer Plus 笔记004

这篇笔记涵盖了C++中的原始字符串、共用体union的使用注意事项、内存管理的新旧操作符搭配、strncpy函数的细节、vector与array的区别、布尔变量的输出方式、运算符优先级以及睡眠函数的使用。强调了new和delete的配对使用以避免内存泄漏,以及递增/递减和解除引用运算符的优先级规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)P087——原始字符串(Raw String)

例如:cout<<R"( C++ programmers use endl instead of \n )"<<endl;


(2)P094——共用体union

注意:如果union的成员含有string对象,则必须为共用体添加构造函数和析构函数,

否则会出现编译错误。

union One4All
{
    One4All()  //构造函数不能删除
    {
        ;
    }

    ~One4All()  //析构函数不能删除
    {
        ;
    }

    int intValue;
    long longValue;
    double doubleValue;
    string stringValue;
};

注意:结构体中不可加入构造函数和析构函数,否则会出现编译错误。

struct Widget
{
    //Widget(){;}
    //~Widget(){;}
    int type;
    string brand;
};

(3)P105——new和delete必须配对使用,否则将发生内存泄漏。

注意:用new(没有方括号)为数据对象分配内存,应该使用delete(没有方括号)来释放;

          用new [] 为数组分配内存,应该使用delete [] 来释放,并且delete时要使指针指向内存起始位置。

举个例子:

double* pDouble = new double[3];  //用new为数组动态分配内存
pDouble[0] = 0.2;
pDouble[1] = 0.4;
pDouble[2] = 0.6;
pDouble += 2;
cout << "After pDouble += 2:" << endl;  //现在pDouble指向pDouble[2]
cout << "pDouble[0] = " << pDouble[0] << endl;  //0.6
pDouble -= 1;
cout << "After pDouble-=1:" << endl;  //现在pDouble指向pDouble[1]
cout << "pDouble[1] = " << pDouble[1] << endl;  //0.6
pDouble--;  //现在pDouble指向pDouble[0]
cout << "Finally, *pDouble = " << *pDouble << endl;  //0.2
delete[] pDouble;

      在上面的代码中,如果删除了第11行和第12行,则在执行delete[] pDouble;时,指针pDouble指向的是pDouble[1],而不是pDouble[0]。此时delete,指针没有指向内存起始位置,程序将发生运行错误,可能导致程序崩溃。


(4)P114——strncpy(目标char*, 源char* ,n)

n:要复制的最大字符数。如果目标数组有余,则自动添加\0;

      如果目标数组不足,则全部复制过去,不会自动添加\0。

char animal[4]={0};
strncpy(animal,"cat",4);  //自动在animal[3]处添加'\0'
strncpy(animal,"tiger",4);  //目标数组animal用完,animal[3]为'e'


(5)P120——vector类和array类

创建vector类对象:vector<typeName> vectorObjectName(size);  

//动态数组,长度可变,使用new和delete管理内存(free store, heap)

创建array类对象:array<typeName, size> arrayObjectName;  

//定长数组,长度不可变,使用栈静态分配内存


(6)P129——以true和false的形式输出布尔变量

cout.setf(ios_base::boolalpha); 或者 cout.setf(ios::boolalpha);


(7)P135——递增/递减运算符和解除引用运算符的优先级

A. 前缀递增、前缀递减和解除引用运算符优先级相同;

B. 后缀递增和后缀递减优先级相同(而且比前缀运算符要高)。


(8)P149——睡眠函数或者挂起函数

A. 加入头文件<windows.h>
Sleep(n):其中n以毫秒为单位。
B. 加入头文件<unistd.h>

sleep(n):其中n以秒为单位。


(9)P149——类型别名typedef

typedef char* charPointer;
typedef int* intPointer;
typedef float* floatPointer;
typedef double* doublePointer;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值