命名空间
using namespace std;//标准命名空间
namespace A
{
int a = 1;
void print()
{
cout << "namespace A" << endl;
}
}
namespace B
{
int a = 2;
void print()
{
cout << "namespace B" << endl;
}
}
namespace C
{
namespace D
{
struct test
{
int a;
};
}
}
int main()
{
using namespace A; //优先级较低
cout << " a =" << a << endl; //1
cout << " a =" << B::a << endl; //2
using B::a; //优先级较高
cout << " a =" << a << endl;//2
print();//namespace A
C::D::test t;//嵌套命名空间
}
cout ———-> 对象
<< ———-> 重定向。重载
:: ———-> 作用域限定符
register 寄存器变量
在C中:
不能被取地址
在C++中:
出现register int a; &a;
a不再是寄存器变量而是普通变量
全局变量
未初始化的全局变量是0
未初始化的局部变量是垃圾值
int a;
int a = 1;
在c中:
重复定义多个全局变量是合法的,都会被链接到全局数据区的同一个地址空间
在C++中:
不允许重复定义同一个全局变量
struct
类型加强 可以作为一个数据类型
在C++中, struct和class基本一样,不过class的权限是私有的
函数返回值与形参
print()
{
}
C:
返回值void可以省略。可以接受任意个参数
形参有void和没有void不一样
C++:
函数必须有返回值类型。
形参有没有void都一样
bool
bool a = ture; //值非0即1;
三目运算符
int a = 1, b = 2;
int c = (a > b)? a: b;
*((a > b)? &a : &b) = 10;
C中:三目运算符不能做为左值,结果是常量
(a > b)? a: b = 10;
C++中:条件表达式可以作为左值,返回值是变量
const
C:
只读变量,不能直接修改
C++:
const int a = 1;
a 就是常量,存在于符号表里,不占用内存
int *p = (int *)&a;
操作系统会分配4个字节的内存,内存里存放的是1
*p = 3;
cout << p << "," << a << endl;
3 ,1
a是常量,用1来替换
const与#define区别
作用域不一样
void print()
{
const int a = 1;//局部变量,函数内部有效
#define b 1 //宏,这行向下有效,直到遇见#undef
}
就近原则
const int *p;
p只的内存不能改,即不能*p++
int *const p
p不能改,常指针,即不能p++
const int *const p;
都不能改
引用
定义引用的时候,一定要初始化
不能返回局部变量的引用
引用在C++内部是一个常指针
C里的数组也是一个常指针
当使用引用语法的时候,不去关心编译器怎么做
出现奇怪现象的时候才考虑C++编译器怎么做
struct test //声明
{
char &a;//引用就是常指针,指针都是4个字节
char &b;
};
int &a = 1;//不能用常量初始化引用
const int &b = 1;//用常量初始化常引用
int *p = (int *)&b;
//b++; 常引用不能被修改
(*p)++;
cout << b << endl;//2
int a = 1;
const int &c = a;//用变亮初始化常引用
//c++;
a++;
cout << a << endl;//2
默认参数
一旦使用的默认参数,后面必须使用默认参数
int add(int a, int b, int c = 3, int d = 0)//默认参数,占用参数
{
return a + b + c;
}
重载函数
构成重载的条件:
1、参数个数不同
2、参数类型不同
3、参数顺序不同
返回值不同不能构成重载