认识C++
编译运行步骤
编辑(.cpp .h) 编译(形成.obj) 链接(.exe) 执行(装载程序进入内存) 调试
函数原型 int area(int,int); 等价于 int area(int a,intb);
类似java 的接口
命名空间 using namespace std;
预处理命令 符号 "#"开头
引用
关键字 & 如Type &a=object;
a实际会指向对象
- 创建时必须初始化
- 初始化对象引用后不能更改
- 不能是null
const 限定符
int * const p=&a;
指针指向的内存地址不能变 ,地址的值可以变
const int * const p=&a;
地址和值都不能变
动态分配内存
关键字 new 如 Type *p=new int
//没有初始值 Type *p=new int(10);
//有初始值 int *p1=new int[10];
//初始化数组 等式左边为指针
释放内存
delete p;
//释放数组用 delete[] p
void * p;//表示P指针的类型不确定
String 对象
string str1="i am lili!"; //类与java不一样 , 类不需要大写
string str2("who are you!);
string str3=str1.substr(2,2); //截取第2个字符
int i=str1.find("am",0) //第0个开始查找 字符串在主串的位置
返回值
int & index(int i);
//返回引用的函数
类型标识符 * 函数名(参数列表);
//返回指针
string input(const int m)
//返回对象
inline关键字
C编辑器 执行到该关键字修饰的函数时不产生实际函数调用,而是用函数体替换调用表达式。
函数的默认参数
在原型中定义 如 void f(int a,int b=1,int c=2 )
//默认参数写右边(不能写左边,因是从左到右匹配)
如果调用给出实参,则用实参,如果没有给出,则用预先声明的默认形参值.
int add(int x=5,int y=6){}
new创建生命周期可控的对象 Point * pt1=new Point;
复制构造函数
类名::类名(const 类名&引用对象名)
- 也是一种构造函数,不能指定函数返回类型。
- 只有一个参数,是对同类的某个对象的引用。
- 没一个类都有一个复制构造函数
-
析构函数
- Point();
- 一个类只有一个,没有参数,不能重载
- 撤销对象时,调用析构函数。
- 不指定返回类型
函数模板 template <class T> 或 template <typename T>
template <class T> T max(T m1,T m2){
return (m1>m2)?m1:m2;
}
传值(拷贝副本)
void sendValue(char ch){
cout << ch << endl;
cout << (ch=='a') << endl;
}
传地址(修改原地址)
void sendAddress(int * px,int * py){
cout << px<< " " << py <<endl;
}
传引用
void sendAddress(int &a,int &b){
cout << a<<" "<< b<<endl;
a=100;
}
类和对象
类声明
class 类名{
函数和数据 // 不说明访问权限,默认是私有的
private:
私有数据和函数 //只可在本类中访问
int a,b; //类体中不允许对数据成员初始化 如 int a(2),b(3); 是错误的 产生具体对象时才有意义
public:
公有函数和数据 //通过该访问权限修饰的函数来访问私有
void Display(); //函数原型(声明函数)
void Setab(int m,int n){ //类体内定义 默认为inline
}
protected:
保护数据和函数
}
返回类型 类名::成员函数名(参数列表){ //在类体外定义成员函数 需要类名和作用域运算符 ::
函数体 //内部实现
}
inline 返回类型 类名::成员函数名(参数列表){ //在类体外定义成员函数(内联)
函数体 //内部实现
}
使用类的对象
Point p1,p2;
Point *p =&p1;
Point &p3=p2;
p1.Setab(5,10); //对象和引用 调用函数
p->Display(); //指针访问
p3.Setab(1,2); //引用 调用函数
静态成员
静态成员必须初始化
数据类型 类名::静态数据成员名=初始值;
类体内初始化:
static int s;
类体外初始化:
int Point::count=0;
友元函数
友元函数是独立与当前类的外部函数,
但它可以访问该类的所有成员
友元可以是类或函数
class Point{
private:
public:
friend double distances(Point &,Point&); //声明友元函数
}
double distances(xxxx){}//定义友元函数
const对象
常量成员(常数据成员,常引用(只能在构造函数初始化),静态常数据成员((在类体外初始化))
const
成员函数-> 常成员函数
对象->常对象 //只能调用他的常成员函数,不能调用其他的成员函数
继承和派生
单一继承
class 派生类名称:访问控制 基类{
p
p
p
}
构造函数的执行顺序:
1.调用基类的构造函数初始化基类成员(基类从左向右).
2.对新增成员初始化,上到下
3.执行派生类的构造函数体
类的保护成员
protected
派生类对基类的保护成员访问与公有成员的访问相同
派生类对象对基类保护成员访问与私有成员的访问相同
基类 派生类的成员函数对基类的访问 基类对象(派生类对象) 外部函数
private 不可访问 不可访问 不可访问
protected protected 不可访问 不可访问
public public 可访问 可访问
私有派生:子类私有派生了爷爷类,则孙子类不可以直接调用爷爷类的方法
保护派生:子类保护派生了爷爷类,则爷爷类是保护的成员属性在子类还是保护。(私有不可继承)
二义性和支配规则
作用域运用符和成员名限定,派生支配基类的同名函数
obj.Base1::fun() obj.Base2::fun()
virtual函数