该文章用于边学习边记录,也是为了之后复习用。
Hello World!
#include<iostream>
int main(){
std::cout<<"Hello,C++World!"<<std::endl;
return 0;
}
如果在头文件下插入语句
using namespace std;
程序相关名字就可以省略前面的std::。
定义变量的方式
- 类型 变量
- 类型 变量 = 表达式
- 类型 变量(表达式)
- 类型 变量{表达式} (c++ 11 新增)
- 类型 变量列表
“类”是抽象的,不占用内存,而类的实例时具体的,要占用内存。
常量对象
绝大部分变量或对象在生存期内会发生变化,也有少量变量不会发生变化,C++引入 const关键字来表达这种情况。
看的时候可以将一个const和一个变量类型放在一起。
- const int a = 100 # a不能改变
- const int *p1 = &i #*p1的内容即(&i)不能改变,但p1指针的地址可以改变,只要保证它所指的内容不变
- int *const p2 = &i # p2本身的地址不能变,但所指的内容可以改变
- const int *const p3 = &j # 都不能变
若要传入常值引用,那么被调用的函数都要加上const确保不改变传入的内容。
函数重载
C++允许多个函数重名,但必须有不同的参数类型或者参数个数,引用时可以根据实参的个数和类型选择相应函数。
内联函数
inline int function()
提高运行速度,一般在头文件内,不可递归不可含循环
缺省参数值
如果在定义函数时就定义形参的值,那么引用时如果不传入实参那么就会用已经设置的默认值,也可以只传入前几个值,这样后面没有传入的值的参数会使用默认值。
参数传递
#include<iostream>
using namespace std;
void swap1(int x,int y){
int t;
t=x;
x=y;
y=t;
}
void swap2(int *px,*py){
cout<<&x<<endl<<&y<<endl;
int *pt;
pt=px;
px=py;
py=pt;
}
void swap3(int *px,int *py){
cout<<&x<<endl<<&y<<endl;
int t;
t=*px;
*px=*pt;
*py=t;
}
void swap4(int &x,int &y){
cout<<&x<<endl<<&y<<endl;
int t;
t=x;
x=y;
y=t;
}
int main(){
int x=3,y=5;
//swap1(x,y);
//swap2(&x,&y);
//swap3(&x,&y);
//swap4(x,y);
cout<<x<<' '<<y;
}
swap1结果:x=3,y=5; 只改变了形参,实参没有改变
swap2结果:x=3,y=5; 只改变了指针的地址,所指的内容并没有改变
swap3结果:x=5,y=3; 改变了指针所指的值,可以实现交换
swap4结果:x=5,y=3; 传入引用,直接改变,可以实现
动态分配和内存释放
内存泄漏:由于找不到使用的内存地址而造成该内存无法被访问到,造成内存丢失。程序在结束后会释放所有已申请的地址,但是如果是操作系统等长时间运行的程序,如果存在内存泄漏,若一直循环那么系统内存会被占用完毕,导致程序崩溃。
申请方法:
T *p = new T(可初始化)
例如:
int *p1= new int(10)
int *p2 = new int[10]
int *p3 = new int[10 *10] #二维数组
Node *newnode = new Node
string *p1 = new string;
*p1 = “asdasd”;
cout<<*p1;
释放方法:
delete p1;
delete[ ]p2; (p2 为数组)
枚举
enum 枚举名 {枚举元素1,枚举元素2,……};
若不赋值,那么默认第一个元素值为0,后面每项加一
e.g.
#include <stdio.h>
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
enum DAY day;
day = WED;
printf("%d",day);
return 0;
}
常见数据结构
栈和队列,向量
#include<stack>
#include<queue>
#include<vector> #去查操作
#include<iostream>
using namespace std;
stack <int> S;
queue<int> Q;
vector<int> A(n*n,0) # 直接申请了n*n大小的连续空间,并赋值为0;
int x;
Q.push(x);
S.push(x);
S.empty();
Q.empty();
S.top() #栈顶元素
Q.front() #队首元素
类声明和类实现
类是现实世界或思维世界中的实体在面向对象程序设计中的反应。
class CSet{
public:
成员函数,可以直接定义函数,也可以在类外定义函数内容
private:
私有成员数据
}
类的成员可以访问共有或私有成员,但从类外只能访问类的公有成员
成员函数体内可以访问当前对象的数据成员,也可以调用其他成员函数,甚至递归调用函数本省。
类的成员函数的实现也可以定义在类定义外,定义时要加上“类名::”
构造函数
类的对象建立时会自动调用类的构造函数。构造函数也是类的成员函数,构造函数的名字与类名相同,无返回值,也无返回类型void声明。构造函数也可以重载。 可以用来给私有成员赋初始值
如果没有提供构造函数,系统会自动合成一个无参构造函数(空语句)
析构函数
类对象消失时会自动调用析构函数,进行扫尾处理,可以用来释放动态分配的资源,没有动态分配则可以没有。
类的构造函数可以有多个,但是析构函数只有一个,名字为“~类名”,没有参数,返回值和返回值类型。
对象引用
大型对象的复制和赋值会产生大量的开销,传递引用开销比较小,省去了复制的时间和空间。
this 指针、类成员的作用域和生存期
普通类成员函数隐含this指针,指向当前对象。C++保证每个对象至少占一个字节的内存空间,任意时刻,不同对象的地址不同。