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

这篇具有很好参考价值的文章主要介绍了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 <iostream>
#include <stdlib.h>
using namespace std;

//malloc free  # include <stdlib.h>  库函数
//new delete key work 关键字

int main()
{
    //C
    int *p = (int*)malloc(sizeof(int));
    int *p = static_cast<int*>(malloc(sizeof(int)));

    //C++  单变量空间
    int *p = new int(200);
    //*p = 200;
    cout<<*p<<endl;

    string *ps = new string("aaa");
    //*ps = "china";
    cout<<*ps<<endl;

    struct Stu{
        int age;
        string name;
    };
    Stu *pStu = new Stu{10, "bob"};
    cout<<pStu->age<<endl;
    cout<<pStu->name<<endl;

    return 0;
}

多变量空间  数组

#include <iostream>
#include <string.h>  // #include <cstring>
#include <stdlib.h>
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<<pi[i]<<endl;
    }

    char **ppc = new char*[5]{NULL};
    ppc[0] = new char[10];
    strcpy(ppc[0], "china");
    ppc[1] = "automan";
    ppc[2] = "greatwall";

    while(*ppc)
    {
        cout<<*ppc++<<endl;
    }

    return 0;
}

一维、多维

#include <iostream>
#include <stdlib.h>
#include <string.h>
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 <iostream>
#include <stdlib.h>
#include <string.h>
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 <iostream>
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<<SQR(i++)<<endl;
    }

    return 0;
}

强制类型转换

#include <iostream>
#include <stdlib.h>

using namespace std;

void func(int & v)
{
    cout<<v<<endl;
}

int main()
{
    static_cast  对于隐式类型可以转化的,即可用此类型

    float a = 5.6;
    int b = 5;

    //隐式类型转换
    a = b;
    b = a;

    b = static_cast<int>(a);
    a = static_cast<float>(b);

    void *p; int *q;
    p = q;
    q = p;  //报错
    q = static_cast<int*>(p);

    int x = 10;
    int y = 3;
    float z = static_cast<float>(x) / y;

    char * pc = static_cast<char*>(malloc(100));

    reinterpret_cast  对于无隐式的类型转化,static_cast不可用

    char * p; int * q;
    p = reinterpret_cast<char*>(q);
    int a[5] = {1, 2, 3, 4, 5};

    int *p = (int*)((int)a+1);
    int *p = reinterpret_cast<int*>((reinterpret_cast<int>(a) + 1));
    cout<<hex<<*p<<endl;

    const_cast  脱常,只能应用于指针和引用
    const 修饰的一定不可以改

    const int a = 19;
    func(const_cast<int&>(a));

    dynamic_cast

    return 0;
}

宏,在预处理阶段发生了替换

常量编译阶段发生了替换

常量不变

命名空间

命名空间为大型项目开发,避免命名冲突的一种机制。

:: 作用域运算符,前面要命名空间

全局无名命名空间

局部

namespace  是对全局命名空间的再次划分。

#include <iostream>

using namespace std;

int v = 55;  // 全局

int main()
{
    int b = 10;  // 局部
    int *p = &v;
    cout<<v<<endl;
    cout<<b<<endl;

    cout<<::<<endl;

    return 0;
}
#include <iostream>

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<<Space::x<<endl;

    using Space::x;
    x = 20;
    cout<<x<<endl;

	using namespace Space;
	Stu s = {1, 2};
	cout << s.a << "---" << endl;

    using namespace Other;
    Other::x = 10;
    y = 20;
    cout<<Other::x<<y<<endl;

    int m, n;
    std::cin>>m>>n;
    std::cout<<m<<n<<std::endl;

    return 0;
}

如果有局部变量名相同,冲突

支持嵌套

#include <iostream>

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

using namespace std;

namespace Space
{
    int x;
}

namespace Space
{
    int y;
}

int main()
{
    using namespace Space;
    int x = 10;
    int y = 20;

    cout<<x<<y<<endl;

    return 0;
}

相同空间名会合并

String类

#include <iostream>

using namespace std;

//string 不是关键字,而是一个类

int main()
{
    std::string str;

    string str("china");
    string str = "china";
    str = "good";
    string str2(str);

    cout<<str<<endl;
    cout<<str2<<endl;

    string s = "china";
    s[3] = 'w';
    cout<<s<<endl;

    char buf[1024];
    strcpy(buf, s.c_str());  //string -> char* c_str返回字符串
    cout<<buf<<endl;

    str.swap(str2);  //交换两个字符串  swap 成员函数

    int n = str.find('i', 0); //查找一个字符的位置,返回下标,找不到返回-1
    cout<<"n = "<<n<<endl;

    string sArray[10] = {
        "0",
        "1",
        "22",
        "333",
        "4444",
        "55555",
        "666666",
        "7777777",
        "88888888",
        "999999999",
    };

    for(int i = 0; i < 10; i++)
    {
        cout<<sArray[i]<<endl;
    }

    return 0;
}

总结

malloc free C库函数  ;  new delete  new[]  delete[] 关键字

new delete > malloc free

申请单变量空间

申请数组  一维  多维

#include <iostream>

using namespace std;

struct Str
{
    char *p;
};

int main()
{
    string *ps = new string;
    *ps = "china";

    cout<<ps<<endl;   //输出地址  对象的地址
    cout<<*ps<<endl;  //输出值    对象的内容
    
    struct Str str = {"abcdefg"};

    int *pi = new int[10]{0};

    char **ppc = new int*[5]{NULL};  //定义指针数组

    int (*p)[4] = new int[3][4];

    return 0;
}

erase(0, npos)

从0开始,一直删除到' '位置

str.erase(0, str.find_first_not_of(' '));

下标后,往后删除

str.erase(str.find_last_not_of(' ') + 1);文章来源地址https://www.toymoban.com/news/detail-664440.html

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

int main()
{
    FILE *fp = fopen("aa.txt", "r+");  //打开并读取文件
    if(fp == NULL)
        return -1;

    vector<string> vs;
    char buf[1024];
    
    while(fgets(buf, 1024, fp) != NULL)  //读取文件内容
    {
        vs.push_back(buf);  // 内容接在后边
    }

    for(int i = 0; i < vs.size(); i++)
    {
        cout<<vs[i]<<endl;
    }
    fclose(fp);
    
    return 0;    
}

到了这里,关于C++(4)C++内存管理和命名空间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】1. 命名空间

    当我们使用c语言编写项目时,可能遇到以下情况: 变量名与某个库函数名重复,导致保错。这种情况一般是自己不知道引用的头文件包含哪些库函数。 2. 和队友一起编写项目时,自己使用的标识符和队友的标识符名字一样,导致代码整合时发生错误。这种情况很难避免,毕

    2023年04月13日
    浏览(102)
  • 【C++ 记忆站】命名空间

    在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace的出现就是针对这种问题的。 很多人在开

    2024年02月12日
    浏览(35)
  • 【C++】命名空间

    命名空间时怎么来的?它又是什么,让我们一起来看一下吧 首先了解:在同一个域中不能同时出现重名的变量或函数名等(不同域中可以尽管是全局与局部域) ok 我们来看 在工程项目里,一开始用 C语言 开发时,可能你在你的项目文件中给你的变量(或函数)取了一个好名

    2024年02月02日
    浏览(42)
  • C++的命名空间

    C++和C语言是有一些相似的地方的,而且C++就是C语言的改进版本,所以学习C++也得学习C语言,但是他们又是有很多不同的地方 下面我们就看一下C++的命名空间 我们首先看一下 如果是这一段代码,那么这里输出的是多少呢?   很好这里输出的是1,这里C语言里面也说过,如果

    2023年04月18日
    浏览(40)
  • 【C++】命名空间详解

    目录 前言 命名空间的定义  命名空间的使用 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。 使用命名空间的目的是对标识符的名称进行本地化 , 以 避免命名冲突或名字污染 ,namespa

    2024年01月25日
    浏览(74)
  • C++——命名空间(namespace)

    目录 1. C语言命名冲突 2. 命名空间定义 3. 命名空间使用 可能大家在看别人写的C++代码中,在一开始会包这个头文件:#includeiostream 这个头文件等价于我们在C语言学习到的#includestdio.h,它是用来跟我们的控制台输入和输出的,这里简要提下,后续详谈。 除了上面这个头文件,

    2024年02月10日
    浏览(41)
  • C++ :命名空间域

    目录 冲突与命名: 举个例子: 全局与局部: 域作用限定符:  命名空间域: 命名空间域的使用方式:  加命名空间名称及作用域限定符 使用using将命名空间中某个成员引入 使用using namespace 命名空间名称 引入  嵌套使用 在C语言中,我们通常会使用stdlib.h  而stdlib.h 本质上

    2024年01月22日
    浏览(39)
  • 【C++】命名空间 ( namespace )

    命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开,使其与其他代码的名称不冲突; 命名空间的原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,同时若是在同一个作用域内可能出现的命名冲突也不会造成影响,有效

    2024年02月04日
    浏览(37)
  • 【C++】namespace 命名空间

    两个术语: 声明区域:声明区域是可以在其中进行声明的区域。 潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。 名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代

    2023年04月08日
    浏览(38)
  • C++命名空间

    目录 一、引入缘故 二、域 三、namespace 四、域作用限定域 五、访问命名空间域         在c语言中,在大型文件内命名冲突问题是一个比较大的缺陷         一般常见的命名冲突可能是 与库函数冲突 内容本身相互冲突         于是引入命名空间的概念 域包括 类域

    2023年04月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包