本文已参与「新人创作礼」活动,一起开启掘金创作之路。
指针与动态内存分配
T *p = new T;
delete p;
T *q = new T[n];
delete[] q;
#include<iostream>
using namespace std;
int main(){
int n = 4;
int *p = new int[4];
char *c = (char *)p;
char ch = 'A';
int len = n * sizeof(int) / sizeof(char);
for (int i = 0; i < len; i++){
c[i] = ch + i;
}
for (char *r = c+len; c < r; c++){
cout << *c << ' ';
}
delete[] p;
return 0;
}
A B C D E F G H I J K L M N O P
一个int的内存可以被当做4个char型的用
动态申请的内存记得销毁,不然会产生内存泄漏,delete释放内存时,对于数组要加[],不然只释放了第一个内存,也会产生内存泄漏。
尽量用new和delete,而不是用malloc和free以及realloc
类和对象
对象之间通过发送/接收消息来协作完成各种任务
在C++里,struct也用来定义类,实例化时不需要加上struct,只用类名就可以
C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct 只能包含成员变量,不能包含成员函数。而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。
C++中的 struct 和 class 基本是通用的,唯有几个细节不同:
- 使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。
- class 继承默认是 private 继承,而 struct 继承默认是 public 继承(《C++继承与派生》一章会讲解继承)。
- class 可以使用模板,而 struct 不能(《模板、字符串和异常》一章会讲解模板)。
C++ 没有抛弃C语言中的 struct 关键字,其意义就在于给C语言程序开发人员有一个归属感,并且能让C++编译器兼容以前用C语言开发出来的项目。
在编写C++代码时,我强烈建议使用 class 来定义类,而使用 struct 来定义结构体,这样做语义更加明确。链接中有反例
#include<iostream>
using namespace std;
struct Student
{
string name;
double score;
void print(){
cout << name + " " << score << endl;
}
void print2(); //函数的声明
};
void Student::print2(){ //函数实现
cout << name + " " << score << endl;
}
int main(){
Student s[3];
s[0].name = "zhangsan";
s[0].score = 90.2;
s[0].print();
s[1].name = "zsan";
s[1].score = 92.2;
s[2].name = "han";
s[2].score = 93.2;
Student *p = s;
p += 1;
cout << p->name <<endl;
(*(p+1)).print();
p->print2();
return 0;
}
输出:
zhangsan 90.2
zsan
han 93.2
zsan 92.2