c#开发园地

c#开发园地

管理

 

指针变量(参数)可以用任意 对象变量代替 。

 

 

 

 

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);

posted on 2008-11-01 13:33  chl  阅读(900)  评论(0)    收藏  举报