指针变量(参数)可以用任意 对象变量代替 。
1, using namespace std 代表导入std命名空间
如果不导入,可以这么写 std::string s;
不是c#里面的 . 了
2,按址传值分为引用类型参数按引用调用 和 指针按引用调用
引用类型参数按引用调用 void chl(int &ch) &ch相当于 c#的 ref ch
在调用chl时
int a=12; chl(&a);
----------------
指针按引用调用 void chl(int *ch) //需要一个int类型的指针变量
调用时 int a=12; int *ch=&a; chl(ch);或者chl(&a);
int a=12;
int &b=a;
现在b不是复制了a的值,而是复制了a的地址,现在对b的一切改变都会改变a
---------------------
还有就是返回值如果是按引用传递,可以写成
int & 函数名(参数);
3,c++的函数分为函数声明和函数定义,声明可以只写参数类型,不写参数名称,而定义必须写参数名称
int chl(int,int); 声明
int chl(int a,int b){//代码} 定义
int chl(int [], int *); 声明
int chl(int a[],int *b);定义
4 将指针传递给函数有4种方法 常量数据的常量指针 非产量数据的非常量指针 非常量数据的常量指针 常量数据的非常量指针
对于地址和变量是否能改变的要求合理运用4种
5指针可以应用+,-,+=,-=运算符,且指针算法只对数组有意义
int a[3]={1,2,3}; //与 c#中定义数组格式不同
int *b=&a[0];
b+=1; //此时指针指向第2个数组元素 此时*b相当于a[2]
指针变量与数组可以变量可以互换使用
6 c++中的 函数指针,与c#中的委托是一样的,首先需要为函数指针制定函数签名
例如函数
int test (int);
定于具有相同函数签名的函数指针 typedef int (*chl) (int) //定义了一个函数指针“类型”chl
定义一个函数指针变量 chl ch
赋值 ch=test;
所以如果一个函数需要一个函数指针作为参数的话,要这么写 void cccc(chl a){ a(12);}
调用cccc(ch)或者cccc(test) //实参可以使函数名或者函数指针的变量
7 ::2个作用,一是定义类声明的函数。二是引用全局变量(类名::全局变量)
引用类成员,如果是变量用 类变量.成员 如果是。类指针用 类指针->成员
8头文件以.h 文件结尾,用于声明 函数,接口
而源文件以.cpp结尾 用于定义函数,类型(也就是实现接口,用类型::定义好的函数)
9 c++没有c#中的属性,而是用xxget和xxset函数来完成相应功能
10c++中 const不但可以作用于值类型也可以作用于引用类型,比如
const Time time(1,2) //这里Time是一个class,并且此time不能被修改了
const函数这么写
void chl() const 或者 void 类名::chl() const //此const函数主要限制函数的返回值,它吧函数的返回值设置为const,所以我们无法修改从const函数中得到的返回值const对象只能被const函数访问,非const函数访问const对象会引发错误
关于const修饰变量
int const chl=初始化的值; //c的值不能改变,必须在定义时给出初始化的值
类型x const chl=初始化的对象; //chl变量指向的初始化的对象不能改变
const int * const chl=初始化的值; //指针chl的内容不能改变 并且 chl指向的值(对象)也不能改变 。必须在定义时给出初始化的值
11,在类的构造函数定义中实例化一个成员(如果此成员的构造函数正好需要这个类的构造函数中的一些参数)
class chl //类chl的声明,在。h文件中
{
public:
chl(int,int);
private:
Date ch //一个date类型的成员,此date类型的构造函数也需要2个int类型
}
chl::chl(int a,int b):date(a,b) //在定义chl构造函数的时候直接为内部成员运行构造函数提供参数 a和b
{//代码}
12,友元 friend
一个类内部可以定义一个友元函数或者友元成员,此友元(friend)函数或成员在类外定义,并且可以访问类内private成员
class chl{
friend class ch;
}
13, c++中的new() 创建一个对象并返回它的指针 ,只要是对象都推荐用new() 他是在堆上分配内存,如果不用new()就是在栈上分配内存
比如有一个类 chl
chl a; //在栈上建立一个chl对象,系统自动负责销毁,适用于小型对象
chl *a=new chl(); //在堆上建立一个对象,要收动用delete销毁,适用于大型对象
数组,创建
int *a=new int[10];
数组,删除
delete[] a //一定要用delete[] 而不是delete
14,运算符重载 用 operator 运算符(参数a。。。) //最左边的参数必须是该运算符所在的类,如果最左边的不是这个类,拿这个函数只能是这个类的友元函数
15,强制类型转换char类型指针 (char*)
16,继承 class a:public b{} //a类继承自b类
如果b类构造函数有参数,a类构造函数定义时要用:b(参数)调用基类构造函数
a:a(int a,int b):b(a,b){}
调用基类函数 基类::基类函数名(参数);
比如基类a中有一个方法chl();
在b类中的一个方法调用基类的chl();
这样写 a::chl();
17 虚析构函数???
18 纯虚函数 virtual void print() const=0;
virtual double area() const{return 0.0};
在子类中需要重新定义
19 char *ch="sdf";
20 void * 代表一个人和类型的指针,比如
int chl(void *); //此函数chl需要一个人和类型的指针参数
21 c++中泛型(模板)函数和类都用
template<class t>开头
然后就是声明/定义 函数或类
但泛型函数使用时不需要显示制定泛型参数,比如
template<class t>
void chl(t);
chl(12) //直接使用
但是类实例化时就必须显示指定泛型参数的类型了
template<class t>
class chl{}
chl<int> a;
22 c++中判断对象不存在,直接用
if(!对象变量)判断
23,结构的初始化和数组一样
struct chl{int a;char b};
初始化: chl a={12,"ccc"};
24,指针的类型,去掉指针变量名 比如
int **p //指针p的类型是 int **
指针指向的类型,去掉*指针变量名
int **p //指针p指向的类型是int *
25 在mfc或者atl中字符串用cstring类型,在stl(标准模版库)中用string
26定义一个指针变量和定义一个类型变量的区别
比如有一个类型chl
chl* a; //定义了一个chl类型的指针
chl a; //定义了一个chl类型的变量
区别在与定义了一个指针变量只是在堆栈中开辟了一个4字节(32位)空间用来存储一个地址,她此时没有指向任何对象
而定义了一个类型变量时那它本身就分配了内存,当然它的内部变量也是分配了内存的。
27 多态必须通过指针来实现
void fun1(Shape s) { s.Draw(); } //非多态
void fun2(Shape &s) { s.Draw(); } //多态
void fun3(Shape *s) { s->Draw(); } //多态
注意参数&s和*s 都代表一个指针,而在函数内部直接用s代表
28纯虚函数与抽象类
基类中必须靠派生类提供重定义版本的虚函数称爲纯虚函数。声明一个纯虚函数需要加上“=0”,具体格式如下:
class Shape {
public:
virtual void Draw() = 0;
}
没有派生类版本时,这个函数不能被调用(在派生类中仍然是纯虚函数)。
含有纯虚函数的类就是抽象类,它不能用于直接建立对象,通常处于一个类层次结构的顶端,作爲基类,为一组具体的派生类提供公共接口。只有抽象类中的所有纯虚函数都被具体定义了,才变成可以生成对象的非抽象类。
虽然抽象类不能用来定义对象,但可以定义抽象类的指针或引用。当派生类定义了所有纯虚函数后,就可以用这种指针或引用来指向派生类对象,然后通过指针或饮用调用虚函数,从而实现多态性的操作。可以参考这一段代码:
void fun1(Shape s) { s.Draw(); } //非多态,本句非法
void fun2(Shape &s) { s.Draw(); } //多态
void fun3(Shape *s) { s->Draw(); } //多态
int main()
{
Rectangle rr;
fun1(rr); //调用类Shape的Draw(),本句非法
fun2(rr); //调用类Rectangle的Draw()
fun3(&rr); //调用类Rectangle的Draw()
}
假设类Shape中的Draw()是纯虚函数,这就是一个典型的例子。
基类中必须靠派生类提供重定义版本的虚函数称爲纯虚函数。声明一个纯虚函数需要加上“=0”,具体格式如下:
class Shape {
public:
virtual int Draw() = 0;
}
没有派生类版本时,这个函数不能被调用(在派生类中仍然是纯虚函数)。
含有纯虚函数的类就是抽象类,它不能用于直接建立对象,通常处于一个类层次结构的顶端,作爲基类,为一组具体的派生类提供公共接口。只有抽象类中的所有纯虚函数都被具体定义了,才变成可以生成对象的非抽象类。
虽然抽象类不能用来定义对象,但可以定义抽象类的指针或引用。当派生类定义了所有纯虚函数后,就可以用这种指针或引用来指向派生类对象,然后通过指针或饮用调用虚函数,从而实现多态性的操作。
29 函数模版定义
template <typename T>
T max(T m1, T m2)
{ return(m1>m2)?m1:m2; }
使用时可以隐式调用 cout<<max<double>(8.5,6); 或者显式调用cout<<max(8.5,6.0);
类模版定义
template <class T> //可以用typename代替class
class TAnyTemp
{
T x,y;
public:
TAnyTemp(T X, T Y):x(X),y(Y) { } //构造函数
T getx() { return x };
T gety() { return y };
}
用上面的模板来定义对象的代码为:
TAnyTemp<int> iOjbect(321,556);
TAnyTemp<double> dObject(3.1416,5.1552);
TAnyTemp<int>与TAnyTemp<double>是完全不同的两个类,除了是同一模板所生成的外,没有任何关系。
30 sizeof(变量或类型)得到 几‘位’bit
http://edu.itbulo.com/200609/105745.htm
31,
c++中没有byte类型,只有char(代表一个字节),byte可以看成是无符号的char
2个16进制数1个字节
#define CHAR char
#define BYTE unsigned char
为c++中定义一个byte类型
33参数默认值 ,只能按照顺序
比如chl(typea a,typeb b,typec c=xxx,typed d=xxx);
只能让cd或者d用默认值,不能单独让c用默认值,除非这样写
chl(typea a,typeb b,typed d=xxx,typec c=xxx);
浙公网安备 33010602011771号