C++(4)C++内存管理和命名空间

内存管理

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<

相同空间名会合并

String类

#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<

你可能感兴趣的:(c++,开发语言)