C++基础
1. 输出hello world
#include <stdio.h>
using namespace std;
int main(){
cout << "Hello World" << endl;
return 0;
}
2. ::双冒号作用域运算符
2.1 全局作用域 直接加::
3. namespace 命名空间
3.1 用途 解决名称冲突问题
3.2 必须在全局作用于下
3.3 命名空间下可以放入 函数、变量、结构体、类
3.4 命名空间可以嵌套命名空间
namespace A {
void func();
int m_A = 20;;
struct Person {
};
class Animal {};
namespace B {
int m_A = 10;
}
}
3.5 命名空间是开放的,可以随时加入新的成员
```cpp
namespace A{
int m_B = 1000;
}
3.6 匿名命名空间 相当于static int m_c 只能在当前文件内使用,就是静态变量
namespace{
int m_C = 0;
int m_D = 0;
}
3.7 命名空间可以起别名
namespace shortName = longName;
4.using声明和using编译指令
4.1 using声明
如果局部范围内还有 sunwukongId 会出现二义性问题,要注意避免
namespace KingGlary {
int sunwukongId = 10;
}
void test01() {
int sunwukongId = 20;
//using 声明 注意避免二义性问题
//写了using声明后 下面这行代码说明以后看到的sunwukongId是用KingGlory下的
//但是 编译器又有就近原则
//这时候就出现了二义性
using KingGlary::sunwukongId;
cout << sunwukongId << endl;
}
4.2 using编译指令
namespace LOL {
int sunwukongId = 30;
}
void test02() {
//int sunwukongId = 20;
//using 编译指令
using namespace KingGlary;//打开房间 具体用
//没用看自己 就近原则>打开房间
using namespace LOL;//打开LOL房间
//如果打开多个房间,也要避免二义性问题
cout << LOL::sunwukongId << endl;
}
5.C++对C语言的增强
5.1 全局变量检测增强
5.1.1在c语言中,定义一个变量之后再对该变量进行定义是可以通过检测的
int a;
int a = 10;
5.1.2在c++中上述定义是不被允许的
//int a;
int a = 10;
5.2 函数检测增强,参数类型增强,返回值检测增强
在C语言中
5.2.1、函数定义时形参类型可以不定义
5.2.2、调用函数时可以多写实参
5.2.3、定义int函数可以不用写return
int getRectS(w, h) {
}
void test02() {
getRectS(10,10,10);
}
5.2.4在C++ 中,参数类型增强,返回值检测增强,函数调用参数检测增强
int getRectS(int w,int h) {
return w * h;
}
void test02() {
getRectS(10, 10);
}
5.3 类型转换检测增强,必须强制类型转换
5.3.1在c语言中,类型转换界限模糊,c可以不用强转
void test03() {
char* p = malloc(sizeof(64));//malloc返回值是void *
}
5.3.2在c++中,必须强制类型转换
void test03() {
char* p = (char *)malloc(sizeof(64));//malloc返回值是void *
}
5.4 struct增强
struct Person {
int m_Age;
//void plusAge(); //c语言中struct不可以加函数
};
void test04() {
struct Person p1;//c语言中使用的时候必须加入struct关键字
}
struct Person {
int m_Age;
void plusAge() {
m_Age++;
}; //c++语言中struct可以加函数
};
void test04() {
Person p1;//c++语言中可以不加struct关键字
p1.m_Age = 10;
p1.plusAge();
cout << p1.m_Age << endl;
}
5.5 bool类型增强(c++中会有bool类型)
c语言中没有bool类型
c++中增加了bool类型
sizeof为1
bool flag = true;
5.6 三目运算符增强
5.6.1 c语言中三目运算符最后返回的是值
int a = 10;
int b = 20;
printf("ret = %d",a>b?a:b);
//a > b ? a : b = 100; c语言返回的是值,这种方法不可取 不能 20 = 100
5.6.2 c++中三目运算符返回的是变量
int a = 10;
int b = 20;
a > b ? a : b = 100; //返回的是b = 100
(b > a ? b : a) = 100; //加括号b=100 赋值成功, 不加括号,直接返回b
5.7 const(常量)增强
c语言中,const修饰的变量是伪常量,编译器是会分配内存的
c++中,const不会分配内存 const int m_B = 2 c++会分配符号表
int *p = (int *)&m_B;
*p = 200;
//此时编译器会分配一个临时的空间
// 相当于 int temp = m_B temp是有内存的
// int *p = (int *) &temp *p指向的是临时的那块儿空间 临时空间是看不到的
c语言中 const int m_A = 10; 是受到保护的 不可以更改的
但是通过一些手段可以修改声明只读的值
5.8 const是否是内部链接
在c语言中,const默认是外部链接,只需要声明extern const int a 外部文件就可以用const int a
在c++中,const默认是内部链接,在主文件声明extern const int a 时,外部文件也必须用extern const int a ,如果想使用,必须用extern提高作用域
5.9 const内存分布情况
5.9.1 const分配内存,取地址会分配临时内存
const int m_A = 10; //不会分配内存,会把值直接放入符号表中
int *p = (int *)&m_A; //会分配临时内存
5.9.2 extern声明,编译器也会给const变量分配内存
5.9.3 用普通变量初始化const的变量
int a = 10;
const int m_A = a;//只要分配内存的变量都会修改值
int *p = (int*)&m_A;
*p = 1000;
5.9.4 自定义数据类型加const也会分配内存
struct Person{
string m_Name = "";
int m_Age = 10;
}
void test(){
const Person p1;
p1.m_Age = 11;//const 不分配内存不允许修改
//只要能分配内存的就可以绕过编译器就该其内容
Person *p = (Person*)&p1;
}