项目来源是研究安卓源码,需要底层对一些音频文件进行修改,涉及到知识盲区C ++,所以就了解了一些C ++ 的高级语法。
研究下来觉得挺有趣的,尤其是有关namespace这一部分,很重要也很实用,所以记录下来。
一般只在主文件中(main.cpp)加入using namespace std,目的是将“std”中所包含的内容引入到当前命名空间。举个例子:
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
string word{"word"};
cout << "word : " << word << endl;
unique_ptr<int> number = make_unique<int>(12);
cout << number.get() << endl;
cout << *number << endl;
cout << "----- yz ------" << endl;
return 0;
}
在这里如果不加using namespace std 会报错,因为cout,endl是在std中定义的,如果将cout替换成std::cout, endl替换成std::endl,才可以使用,所以在开头加上using namespace std就是为了可以直接拿来用。
但是一般不建议在开头加上using namespace std,因为可能会造成很多麻烦,导致命名空间为污染。
定义:namespace Number_Func{ … int(函数)…}
应用:Number_Func::函数名
例如:
命名空间定义一个函数:
namespace Number_Func
{
int add(int a, int b)
{
return a + b;
}
}
main里定义一个函数,同名的:
int add(int a, int b)
{
return a + b + 1;
}
输出:
int a = 3, b = 4;
cout << add(a, b) << endl;
cout << Number_Func::add(a, b) << endl;
输出结果是7和8。
首先声明命名空间,注意不要在头文件中使用using ,创建函数时注意声明和定义分开。
在number.h文件中定义一个函数和一个类
#ifndef NUMBER_H
#define NUMBER_H
#include
namespace Math_Func
{
int add(int a, int b);
class Number
{
public:
Number() = default;
Number(double x);
void info_number() const
{
std::cout << "Number : " << x << std::endl;
}
~Number();
private:
double x{0.0};
};
}
#endif
number.cpp
#include "number.h"
namespace Math_Func
{
Number::Number(double x) : x(x) {}
Number::~Number()
{
}
int add(int a, int b)
{
return a + b;
}
}
在point.h再定义一个同名的函数和不同的类
#ifndef POINT_H
#define POINT_H
#include
namespace Math_Func
{
class Point
{
public:
Point() = default;
Point(double x, double y);
void info_point() const
{
std::cout << "Point x: " << x << " y: " << y << std::endl;
}
~Point();
private:
double x{0.0};
double y{0.0};
};
}
#endif
point.cpp
#include "point.h"
namespace Math_Func
{
Point::Point(double x, double y) : x(x), y(y)
{
}
Point::~Point() {}
}
注意看number.h和number.cpp,在.h文件的命名空间中声明了函数名,并定义了一个类,在.cpp文件中定义函数的实现。就是要做到函数的声明和定义分开。
在main.cpp再定义一个命名空间和普通的函数
#include
#include "point.h"
#include "number.h"
using namespace std;
namespace Number_Func
{
int add(int a, int b)
{
return a + b;
}
}
int add(int a, int b)
{
return a + b + 1;
}
int main(int argc, char *argv[])
{
int a = 3, b = 4;
cout << add(a, b) << endl;
cout << Number_Func::add(a, b) << endl;
cout << "--- multiply file ---" << endl;
Math_Func::Number n1;
Math_Func::Number n2(1.3);
n1.info_number();
n2.info_number();
Math_Func::Point p1;
Math_Func::Point p2(1.3, 2.3);
p1.info_point();
p2.info_point();
cout << Math_Func::add(a, b) << endl;
cout << "----- yz ------" << endl;
return 0;
}
Default Global Namespace是默认全局命名空间,在其他的命名空间中,可以使用“::”来表示默认全局命名空间。
1.在外部声明并定义add函数:
int add(int a, int b);
int add(int a, int b)
{
return a + b + 1;
}
2.在命名空间中可以用“ ::”来调用这一函数:
namespace Number_Func
{
int add(int a, int b)
{
return a + b + 2;
}
int add_int(int a, int b)
{
return ::add(a, b) + 2;
}
}
主函数:
int a = 3, b = 4;
cout << add(a, b) << endl;
cout << Number_Func::add(a, b) << endl;
cout << Number_Func::add_int(a, b) << endl;
最后打印结果就是8,9,10.
可以引入命名空间,也可以只引入一个类或者函数。
{
// 只引入函数
using Number_Func::add_int;
cout << add_int(a, b) << endl;
}
{
// 只引入类
using Math_Func::Number;
Number n1;
Number n2(1.2);
n1.info_number();
n2.info_number();
Math_Func::Point p1;
}
{
// 引入命名空间并解决冲突(全称)
using namespace Math_Func;
Number n1;
Number n2(1.2);
n1.info_number();
n2.info_number();
Point p1;
Point p2(2.3, 4.5);
p1.info_point();
p2.info_point();
cout << Math_Func::add(a, b) << endl;
}
C++支持命名空间别名,例如 namespace Some = Some1::Some2;
就是在namespace中再定义一个新的namespace;
namespace Number_Func
{
int add(int a, int b)
{
return a + b + 1;
}
int add_int(int a, int b)
{
return ::add(a, b) + 2;
}
namespace Next_Number
{
int add(int a, int b)
{
return a + b + 10;
}
}
}
int main(int argc, char *argv[])
{
int a = 3, b = 4;
cout << Number_Func::Next_Number::add(a, b) << endl;//使用嵌套
{
namespace Data_Number = Number_Func::Next_Number;//别名
cout << Data_Number::add(a, b) << endl;
}
cout << "----- yz ------" << endl;
return 0;
}
输出结果就是两个17.