强类型语言,类型检查严格
支持面向对象,泛型,异常(打游戏可不能异常),运算符重载
C++文件后缀可以是 .cpp,.cc,.c等
//includeC++本身的头文件时 使用<不加.h>
#include <iostream>
//C 的头文件 可以加.h 但是C++不推荐
#include <stdio.h>
//推荐 使用C++重写的头文件 把.h去掉 在前面加c
#include <cstdio>
//如果要 include 我们自己写的头文件时 使用 "" 加.h
#include "MyClass.h"
cout的是一个对象 通过<<输出运算符 进行输出 可以连续输出,endl是换行。
cin/cout代替 scanf,cout
std是命名空间,::是域运算符
std::cout << "Hello, World!\n" << 123213 << 3.4324 << 'a'<< std::endl;
std::cin >> x;
// 相当于std::cin.operator>>(x);对象调方法,可省,略写如上
命名空间
//使用指令后的所有std命名空间下的东西 访问时都可以不用在加 std了
using namespace std;
//变量和函数
namespace Hero {
const char *name = "英雄";
void show() {
std::cout << "英雄出现了" << std::endl;
}
}
//命名空间可以分开写
namespace Hero {
int a = 200;
}
//使用声明
using std::cout;
//C++会把所用东西都放在命名空间下,如果我们自己没有写命名空间,默认放在一个没有名字的命名空间下
cout << ::name << endl;
结构
//可以放函数
struct Date {
int year;
int month;
int day;
void show() {
cout << year << "-" << month << "-" << day << endl;
}
};
联合就是在内存中都占同一片地址
union MyUnion {
int x;
int y;
double d;
char cs[4];
};
//可以有匿名联合
union {
int x;
int y;
};
枚举:不再只是普通的int
//注意用枚举提高代码可读性
enum HeroState{
Stand,
Move,
Attack,
Die
};
C++中bool是数据类型,本质也是int,c中是宏定义
运算符可以用其他奇怪的关键字替换
注意值传递和地址传递
C++的参数默认值 必须从右向左给 右边的参数有了默认值左边的参数才可以给默认值
内联函数
//inline 内联函数 执行效率要比普通的函数高
//内联函数执行的时候不会在栈中开辟空间,而是直接把内容拷贝到得调用的方法中
//inline只是向编译器发送请求,希望成为内联函数,编译器会做检查,如果内容少,逻辑简单就会同意申请,如果拒绝了,这个函数调用还和普通函数一样, 同常情况下,如果是个递归函数,肯定会拒绝
inline void print(int x) {
int a = 200;
int b = 300;
cout << x + a + b << endl;
}
哑元函数
//冲突时多一个参数,没有参数名,这样就是哑元
void print(int x, int) {
cout << x << endl;
}
int &r = x;
引用实际是别名,反正r就是x,都是同一个东西,地址都一样。其实写成
int& r=x;更好理解
r是个int类型的引用。
引用是一辈子的,不可以改地址了
// 声明引用必须初始化
//如果要引用一个常量 必须使用常引用
const int &r3 = 500;
// r3 = 500;
弄清值传递x=y、地址传递 int* p、引用传递&x=y
*是寻址运算符也是指针
&是取地址符也是引用
交换两数的多种方法swap
//交换:用引用
void swap(int &x, int &y) {
cout << x << ' ' << y << endl;
int t = x;
x = y;
y = t;
cout << x << ' ' << y << endl;
}
//交换 两数交换不使用第三个变量
void swap2(int &x, int &y) {
x = x + y;
y = x - y;
x = x - y;
}
//按位异或交换 不使用第三个变量
void swap3(int &x, int &y) {
x = x ^ y;
y = x ^ y;
x = x ^ y;
}
//永远不要返回局部变量的引用
int& fc() {
int x = 100;
return x;
}
// static_cast<类型>()
// 转换时做静态检查,即在编译时进行
// void*到其他指针的转换
double d = 3.1415926;
// int x = d; //隐式类型转换
int x = static_cast<int>(d);
// reinterprect_cast<类型>()
// 允许强转任何类型的指针
// 把整数强转成指针,指针强转成整数
double *pd = reinterpret_cast<double*>(pl);
// const_cast<类型>()
// 去掉cv限制
volatile const int a = 100;//值已改但编译器自作聪明,volatile 易挥发的
提醒编译器还是再去内存中取值了。
int *pa = const_cast<int *>(&a); //const int *
*pa = 200;
//获取成员变量地址用 Struct::
&Date::year;
this指针,隐式地传入当前对象