要点简记:
名称空间三种访问方式
编译指令 | 声明 | 域解析符号 | |
---|---|---|---|
语法区别 | using name space std; | usinge std::cout ; | :: |
后续访问cout | cout << variable; | cout << variable | std::cout << variable |
后续访问cin | cin >> variable; | std::cin >> variable | std::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运算符
- address指定的是静态内存首地址。 定位运算符返回address,之后访问的内存块为address起始的size_t字节内存
- 定位new运算符不跟踪内存是否已被引用,需要程序员进行内存管理
- 定位new运算符分配的内存,(静态内存,或已申请可用内存)不可被delete释放