new/delete
C语言 malloc free完成对堆内存的申请和释放。
C++ new delete 类
new:动态申请存储空间的运算符,返回值为申请空间的对应数据类型的地址
int *p = new int(10); 申请了一个初始值为10的整型数据
int *p = new int[10]; 申请了能存放10个整型数据元素的数组,其首地址为arr
#include
#include
using namespace std;
//malloc free # include 库函数
//new delete key work 关键字
int main()
{
//C
int *p = (int*)malloc(sizeof(int));
int *p = static_cast(malloc(sizeof(int)));
//C++ 单变量空间
int *p = new int(200);
//*p = 200;
cout<<*p<age<name<
#include
#include // #include
#include
using namespace std;
int main()
{
char* p = new char[4];
const char* source = "aa";
strcpy_s(p, 4, source);
cout << "p: " << p << endl;
int *pi = new int[5]{0};
memset(pi, 0, sizeof(int[5]));
for(int i = 0; i < 5; i++)
{
cout<
一维、多维
#include
#include
#include
using namespace std;
int main()
{
int(*pa)[4] = new int[3][4]{ {0} };
for (int i = 0; i < sizeof(int[3][4]) / sizeof(int[4]); i++)
{
for (int j = 0; j < 4; j++)
{
cout << pa[i][j] << "";
}
cout << endl;
}
int (*px)[3][4][5] = new int[2][3][4][5];
return 0;
}
内存释放
#include
#include
#include
using namespace std;
int main()
{
int *p = new int;
delete p;
int *q = new int[1000];
delete []q;
//多维只用一个框即可,内核用递归删除
int *r = new int[1000][][];
delete []r;
return 0;
}
内联函数inline function
介于宏函数和普通函数之间
宏函数
优点:代码内嵌,避免了函数调用。
缺点:容易产生歧义,易使text段体积增大。
普通函数
优点:一段高度抽象的逻辑,不易产生歧义,使text段体积减小。
缺点:函数调用的压栈与出栈的开销。
inline 内联函数
优点:一段高度抽象的逻辑,不易产生歧义,使text段体积减小,会进行类型检查,避免压栈与出栈的开销。
代价:增加代码段的空间
本质:以牺牲代码段空间为代价,提高程序的运行时间的效率
适用:代码体很小且频繁调用
为何不把所有函数inline?
内嵌太多,inline变成了给编译器的一种建议
只有当函数只有10行甚至更少时才会将其定义为内联函数。
#include
using namespace std;
#define SQR(i) ((i)*(i)) //宏函数
int sqr(i) //普通函数
{
return i * i;
}
inline int sqr(i)
{
return i * i;
}
int main()
{
int i = 0;
while(i < 5)
{
cout<
#include
#include
using namespace std;
void func(int & v)
{
cout<(a);
a = static_cast(b);
void *p; int *q;
p = q;
q = p; //报错
q = static_cast(p);
int x = 10;
int y = 3;
float z = static_cast(x) / y;
char * pc = static_cast(malloc(100));
reinterpret_cast 对于无隐式的类型转化,static_cast不可用
char * p; int * q;
p = reinterpret_cast(q);
int a[5] = {1, 2, 3, 4, 5};
int *p = (int*)((int)a+1);
int *p = reinterpret_cast((reinterpret_cast(a) + 1));
cout<(a));
dynamic_cast
return 0;
}
宏,在预处理阶段发生了替换
常量编译阶段发生了替换
常量不变
命名空间为大型项目开发,避免命名冲突的一种机制。
:: 作用域运算符,前面要命名空间
全局无名命名空间
局部
namespace 是对全局命名空间的再次划分。
#include
using namespace std;
int v = 55; // 全局
int main()
{
int b = 10; // 局部
int *p = &v;
cout<
#include
using namespace std;
namespace Space{
int x;
void func()
{
printf("void func");
}
struct Stu
{
int a;
int b;
}
}
namespace Other{
int x;
int y;
}
int main()
{
Space::x = 200;
cout<>m>>n;
std::cout<
如果有局部变量名相同,冲突
支持嵌套
#include
using namespace std;
namespace Space{
int a;
int b;
namespace Other{
int m;
int n;
}
}
int main()
{
using namespace Space::Other;
m = 20;
return 0;
}
协作开发
#include
using namespace std;
namespace Space
{
int x;
}
namespace Space
{
int y;
}
int main()
{
using namespace Space;
int x = 10;
int y = 20;
cout<
相同空间名会合并
#include
using namespace std;
//string 不是关键字,而是一个类
int main()
{
std::string str;
string str("china");
string str = "china";
str = "good";
string str2(str);
cout< char* c_str返回字符串
cout<
malloc free C库函数 ; new delete new[] delete[] 关键字
new delete > malloc free
申请单变量空间
申请数组 一维 多维
#include
using namespace std;
struct Str
{
char *p;
};
int main()
{
string *ps = new string;
*ps = "china";
cout<
erase(0, npos)
从0开始,一直删除到' '位置
str.erase(0, str.find_first_not_of(' '));
下标后,往后删除
str.erase(str.find_last_not_of(' ') + 1);
#include
#include
#include
using namespace std;
int main()
{
FILE *fp = fopen("aa.txt", "r+"); //打开并读取文件
if(fp == NULL)
return -1;
vector vs;
char buf[1024];
while(fgets(buf, 1024, fp) != NULL) //读取文件内容
{
vs.push_back(buf); // 内容接在后边
}
for(int i = 0; i < vs.size(); i++)
{
cout<