C++ 名称空间

本文探讨了C++中的名称空间,包括其作用、基本用法、作用域问题以及using指令的区别。此外,还介绍了const和mutable的概念,以及new运算符和定位new运算符在内存管理中的应用。
摘要由CSDN通过智能技术生成

要点简记:

名称空间三种访问方式
编译指令声明域解析符号
语法区别using name space std;usinge std::cout ;::
后续访问coutcout << variable;cout << variablestd::cout << variable
后续访问cincin >> variable;std::cin >> variablestd::cin << variable
new 运算符 与 定位new运算符 区别
new运算符定位new运算符
语法区别*ptr = new size_t*ptr = new (base_address) size_t
内存区别申请堆上内存,动态内存申请由指定的base_address起始的内存
释放区别可直接deleet ptr;不可释放,可在某段指定地址上反复申请,内存需要程序员把握

(一)名称空间

名称空间作用

使用不同厂商提供的类库时,可能导致名称冲突。
名称空间是为解决名称冲突而提供的特性。


名称空间基本用法(自编写sales模块为例)

  • 声明

sales.h 使用关键字namespace + 空间名包含所有函数、变量、结构体的声明

#ifndef SALES_H_
#define SALES_H_
    
namespace SALES
{
    const int QUARTERS = 4;
    struct Sales{
        double sales[QUARTERS];
        double average;
        double max;
        double min;
    };
    void setSales(Sales &s);
    void setSales(Sales &s, const double ar[], int n);
    void showSales(const Sales &a);
}
#endif
  • 定义

sales.cpp 使用关键字namespace + 空间名包含所有函数、变量、结构体的定义

namespace SALES
{
    void setSales(Sales &s)
    {
		..
    }

    void setSales(Sales &s, const double ar[], int n)
    {
		....
    }
    
    void showSales(const Sales &a)
    {
        using std::cout;
        using std::cin;
        using std::endl;
        for(int i = 0; i < QUARTERS; i++)
        {
            if(a.sales[i] != 0)
            {
                cout << "#" << i << ".sales = " << a.sales[i] << endl;
            }
        }
        cout << "max sales is " << a.max << endl;
        cout << "min sales is " << a.min << endl;
        cout << "average sales is " << a.average << endl;
    }
}
  • 使用(三种方式被外部使用的方式)
    main.cpp
#include "sales.h"

int main(void)		#1 使用编译指令 using namespace + 空间名
{
    using namespace SALES;
    Sales sales1;
    setSales(sales1);
    showSales(sales1);
    return 0;
}
int main(void)		#2 使用 域解析运算符 ::
{
    SALES::Sales sales1;
    SALES::setSales(sales1);
    SALES::showSales(sales1);
    return 0;
}
int main(void)		#3 使用using声明
{
	using SALES::Sales;
	using SALES::setSales;//不需要带特征标(参数)
	using SALES::showSales;
    Sales sales1;
    setSales(sales1);
    showSales(sales1);
    return 0;
}

using namespace std; 与 using std::cout; 的区别

  • using namespace std:编译指令,使用后作用域内可以直接访问cout cin
  • using std::cout: using声明, 后续只能直接访问cout,其余需要加入声明,或使用域解析运算符 ::
  • 使用编译指令,若全局被局部所覆盖,编译器不会提示警告。 推荐使用using声明

作用域问题

术语"声明区域":可以在其中进行声明的区域。
术语"潜在作用域":声明点开始,到声明区结束。

  • 在cpp文件的 函数外部声明,潜在作用域就从声明点开始,到文件结束。
  • 函数内声明,潜在作用域就从声明点开始,到函数结束。
  • 代码块内声明(for循环内,if条件分支内),潜在作用域就从声明点开始,到代码块结束 。
  • 总的来说:作用域符合外部引用的一般作用域思路,有局部覆盖全局的情况。

作用域引发的精准访问问题

main.c 如何精准访问namespace里面的variable 全局variable 局部variable

#include <iostream>
using namespace std;

namespace VARIABLE{
	int variable;
};

int variable;

int main(void)
{
	int variable;
	cin >> variable;  //局部覆盖外部,优先访问局部variable
	cin >> ::variable; //域解析,但没有namespace,指定访问全局variable
	cin >> VARIABLE::variable; //精准访问 VARIABLE 里面的variable
}

其他补充2:名称空间嵌套使用

#include <string>
namespace pers
{
	struct Person
	{
		std::string fname;
		std::string lname;
	};
	void getPerson(Person &);
	void showPerson(const Person &);
}

namespace debts
{
	using namespace pers;		//引用上方名称空间
	struct Debt
	{
		Person name;			//可直接使用名称空间内结构体
		double amount;
	};
	void getDebt(Debt &);
	void showDebt(const Debt &);
}

(二)const mutable new delete简易笔记

const 和 mutable

  • const 限定变量只能被访问而不能被更改
  • mutable 表明允许const限定的变量被更改
struct exp{
	int a;
	int b;
	mutable int c;	//mutable
};

int main(void)
{
	const exp exp1{
		9,
		9,
		8};
	exp1.c = 10; //mutable 允许更改值
}

new运算符 和 定位new运算符

  • new : 运算符 分配堆上内存,动态管理
    int *ptr = new int;
    int *ptr = new int[10];
  • delete : 运算符 释放new分配的资源
    delete ptr;
    delete [ ]ptr;
  • new[address] size_t : 定位new运算符
  1. address指定的是静态内存首地址。 定位运算符返回address,之后访问的内存块为address起始的size_t字节内存
  2. 定位new运算符不跟踪内存是否已被引用,需要程序员进行内存管理
  3. 定位new运算符分配的内存,(静态内存,或已申请可用内存)不可被delete释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值