一.命名空间
// 1、命名空间的定义:namespace 命名空间的名称 {}
// 变量、函数、宏定义
namespace Name1
{
int a;
int add(int a, int b)
{
return a + b;
}
#define PI 3.14
// 命名空间的嵌套
namespace Name1_1
{
}
}
namespace Name2
{
int a;
int b;
int c;
}
// 2、命名空间的使用
// 2.1、使用域解析符来引用命名空间中的内容 ::
int main1()
{
// printf ("hello world\n");
Name1::a = 10;
Name2::a = 20;
printf ("a1 = %d, a2 = %d\n", Name1::a, Name2::a);
return 0;
}
// 2.2、使用 using 关键字
int main2()
{
// 将命名空间1打开,后面可以直接使用Name1中的内容,不用再加域解析符
// 后面但凡没有指明具体命名空间的变量、函数。。。。 默认使用Name1中的
using namespace Name1;
a = 50; // Name1中的a
Name2::a = 20; // Name2中的a
printf("a = %d\n", Name1::a);
// 后面但凡没有指明具体命名空间的 c, 默认使用Name2中的 c
using Name2::c;
c = 90;
// b = 30;
printf ("c = %d\n", Name2::c);
return 0;
}
// 全局变量a
int a;
// 2.3、命名空间之间命名冲突:使用域解析符解决冲突
// 和全局空间变量命名冲突
int main3()
{
using namespace Name1;
using namespace Name2;
// a = 10; 有歧义
Name1::a = 10;
// 全局的变量使用默认命名空间的域解析符
::a = 20;
return 0;
}
二.标准输入输出
// C++输入输出头文件
#include <iostream>
// 使用标准命名空间 std
using namespace std;
int main2_1()
{
// cout 标准输出流的对象 ====> 类似 print 往标准输出打印数据
// cout 必须放在一行的最左边
// << 左移操作符 和 cout 一块使用代表数据流向 数据从右边流到左边
// 左边是标准输出(屏幕)右边是 "hello world"
// endl 是 标准库std提供的 ,代表换行
// cout 支持链式操作
cout << "hello world" << endl;
// C语言中的 格式转换在C++还是可以用的
cout << "123\t456\n";
int age = 10;
char *name = "小明";
// cout 输出基本数据类型不需要 %d等 直接输出变量
cout << "a = " << age << ", name = " << name << endl;
printf ("a = %d, name = %s\n", age, name);
return 0;
}
// 标准输入流对象 cin 类似scanf
int main2_2()
{
int a;
double d;
// cin是标准输入 =====> 键盘 数据从左边到右边 从键盘到变量
// 支持链式操作
cin >> a >> d;
printf ("a = %d, d = %f\n", a, d);
return 0;
}
三.寄存器变量
int main3_1()
{
register int a = 10;
// 如果对一个寄存器变量进行取地址操作,register声明将无效
printf ("%p\n", &a);
return 0;
}
四.结构体加强
#include <iostream>
using namespace std;
struct Student
{
int age;
char name[20];
};
int main4_1()
{
// C语言中 结构体只是一种数据的集合,而不是一种新的数据类型,
// 所以在定义结构体变量前加struct关键字
// struct Student stu = {10, "小明"};
// C++中认为 结构体是一种新的数据类型,可以用来定义变量
Student stu2 = {20, "小红"};
cout << "age = " << stu2.age << ", name = " << stu2.name << endl;
return 0;
}
五.bool类型
#include <iostream>
using namespace std;
// bool 值 只有2种, 一个是真 值位1 一个是假 值为0
// C++种,0表示假, 所有非0都位真
int main5_1()
{
bool b = true;
bool b1 = false;
cout << "b = " << b << ", b1 = " << b1 << endl;
int a = 2;
b = a;
cout << "b = " << b << endl;
b++;
cout << "b = " << b << endl;
b = b - 1;
cout << "b = " << b << endl;
b = -1;
cout << "b = " << b << endl;
return 0;
}
六.三目运算符
#include <iostream>
using namespace std;
int main6_1()
{
int a = 10;
int b = 20;
int c = a > b ? a : b;
// C++种的三目运算符可以当左值使用
// C语言返回的是数据的值,不能当左值使用
// C++返回的是变量本身
(a > b ? a : b) = 90; // ===> *(a > b ? &a : &b) = 90;
printf ("a = %d, b = %d, c = %d\n",a, b, c);
// 三目运算符当左值使用的时候,表达式不能包含常量
// (a > b ? 10 : b) = 90; // ===> *(a > b ? &10 : &b) = 90;
return 0;
}
七.const关键字
#include <iostream>
using namespace std;
int main()
{
// C++const修饰的是一个常量,常量的值会放到 符号表中
const int a = 10;
// 如果对const修饰的变量进行取地址操作,则编译器会在内存中为这个变量分配空间
// 但是这个空间是不使用的
int *p =(int *)&a;
*p = 20;
printf ("&a = %p\n", &a);
printf ("p = %p\n", p);
printf ("a = %d, *p = %d\n", a, *p);
int arr[a] = {0};
return 0;
}