命名空间
防止人多变量也多的大型项目中命名发生冲突
namespace mmp /定义一个命名空间域
{
int a = 233;
}
- 域作用限定符使用命名空间里的东东;
- 命名空间域里,支持变量、类型、函数,嵌套定义‘
- 同名的命名空间会自动合并,命名空间里不能有命名冲突。
- 使用命名空间域里的东西的三种方法:------第一种日常练习不必在意
int main()
{
printf("%d \n", mmp::a);
return 0;
}
using namespace std;/标准库的命名空间域
/1.用起来方便,但把自己的定义暴露出去了,容易造成命名污染
/2.不会污染,但需要指定命名空间里某个具体的东东..
using mmp::a;
/3.展开常用的,工程项目中常用的...
using std::cin;
using std::endl;
C++的输入输出
-
endl 等价于 \n -
自动识别类型 -
C++兼容C,哪种输出方便就用哪种。
缺省参数
-
参数有个默认值,你不传参数,就用默认的;传了,就没缺省参数什么事儿了。 -
灵活运用开辟空间大小:没有传参默认开辟三个类型的大小;传参了就按你的来。
void Mall(int* pa, int cap = 4)
{
}
int main()
{
int* a;
Mall(a,100);
return 0;
}
- 全缺省,不传参的时候,全部都设有默认参数;半缺省,必须按照从右往左来设置默认参数,没有设置默认值的变量,必须传参。
- 函数声明的时候设置缺省参数,不能再声明和定义中同时出现。
int add(int a, int b = 10,int c=20)
{
return a + b + c;
}
int main()
{
int e = add(6);
cout << e << endl;
return 0;
}
函数重载
- 参数类型不同 ,个数不同,顺序不同
int double/ double int - C++是根据参数的情况,对相同函数名字的函数在编译时进行了修饰。C语言是根据函数名直接找函数,编译器没有办法区别。
int EatFish(int a , int b )
{
return b - a;
}
int EatFish(int b , double a)
{
return b ;
}
double EatFish(double a, double b)
{
return b - a;
}
-
链接时做的一些事情, -
有函数声明,编译器在编译时就给过,找函数定义就是跳转过去找函数地址。编译生成汇编代码,同时会生成符号表等等,符号表记录着函数的地址。如果把返回值带进修饰规则,则在编译期层面是可以区分的,但在语法调用时,无法区分,不知你是调用哪一个。inr add( int x )/ flaot add(float x) .....add() ? -
如果用别人的C语言库,需要按C编译器编译,则用extern C 来解决
1.
extern "C"
{
#include "cExample.h"
}
2.
extern "C" double sqrt(double);
3.
extern "C"
{
double sqrt(double);
int min(int, int);
}
引用
-
C++中,引用(reference)是指绑定到内存中的相应对象上。左值引用是绑定到左值对象上;右值引用是绑定到临时对象上。 -
这里的左值对象是指可以通过取地址&运算符得到该对象的内存地址;而临时对象是不能用取地址&运算符获取到对象的内存地址。 -
++左值是对应(refer to)内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。 -
引用---->给变量取别名。函数传参,用引用接受,则在函数内部可以直接改变实参,减少了形参的临时拷贝,面对只需读取的函数,const int& 更安全;还可以给指针变量取别名。 -
取别名限制条件,对你的读写权限可以不变或者缩小,但不能放大。 -
类型转换:当操作符左右两边类型不同,提升至大的类型,提升补符号位,同时有临时变量产生,临时变量具有常性,不可以对临时变量引用取别名,证明临时变量的存在: -
引用该可以做返回值。
- 返回引用时,要求被返回的参数,要以引用方式或指针方式存在…
- 返回的参数,出了那个作用域还在。
内联函数和宏
- 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。
- 空间换时间,对编译器而言是一个建议,当代码很长时,会自动忽略,声明和定义不能分离。
- 宏的优缺点?
优点: 1.增强代码的复用性。 2.提高性能。 - 缺点:
1.不方便调试宏。(因为预编译阶段进行了替换) 2.导致代码可读性差,可维护性差,容易误用。 3.没有类型安全的检查 。
C++有哪些技术替代宏?1. 常量定义 换用const ;2. 函数定义 换用内联函数
auto和基于范围的for循环
- auto 自动推导变量的类型
- for 对遍历数组的优化,写起来更省事儿
oid TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)
e *= 2;
for(auto e : array)
cout << e << " ";
return 0;
}
指针空值
- 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
- NULL实际是一个宏,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
- 在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。
void f(int)
{
cout<<"f(int)"<<endl;
}
void f(int*)
{
cout<<"f(int*)"<<endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
动态库,静态库浅析
|