c++学习

来源:互联网 发布:适合男生用的面膜知乎 编辑:程序博客网 时间:2024/06/08 11:58

Const :非const的全局变量在整个程序中都可以访问,加上const限定符呢?

 答:使用修饰符 extern const可以再全局访问。

什么是引用?

定义的类似于: int & ref=val;当引用捆绑于实际对象,对引用的操作即对实际对象的操作。

ref +=2val+2;当引用初始化之后,只要该引用存在,它就保持绑定到初始化时指向的对象。

那什么是const 引用?

Const int &ref;可以读取但不能修改ref、对它赋值都是违法的,因此不能用它来改变它所引用的对象。同时,const int val=10Const int &ref =val; 必须是const引用指向const类型对象,企图使用int&ref=val ,因为通过ref修改val会导致改变了const对象的值,所以这样是非法的。

一个老问题:const 的位置放在哪?

const char *p = greeting; // non-constpointer,
// const data

char * const p = greeting; // constpointer,
// non-const data

使用typedef的意义?

Typedef unsigned int  uint32;隔离平台的数据类型不一致。

Strcut class有何区别?

Strcut是默认的public类型成员,class是默认的private类型。

class可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。

class支持继承,可以继承自类和接口;而struct没有继承性,struct不能从class继承。

class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后立即自动解除内存分配。

性能上的考虑,我们应该考虑使用struct来代替class, struct变量占有堆栈的空间,因此只适用于数据量相对小的场合.

Vector是如何使用的?

std::vector<int> vec;

vecotor<int> ver2(vec);

vector<int>::size_type

vector<int> ver(10);//10 为元素的个数

一般使用方法,注意下面的使用差异。

const std::vector<int>::iterator iter= // iter acts like a T* const
vec.begin();

*iter = 10; // OK, changes what iter pointsto
++iter; // error! iter is const

std::vector<int>::const_iteratorcIter = // cIter acts like a const T*
vec.begin();
*cIter = 10; // error! *cIter is const
++cIter;

析构函数使用虚函数的原因?

析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。

const Rational operator*(constRational& lhs, const Rational& rhs);

很多第一次看到这些的程序员会不以为然。为什么 operator* 的结果应该是一个 const object(对象)?因为如果它不是,客户就可以犯下如此暴行:

Rational a, b, c;
...
(a *b) = c; // invoke operator= on the
//result of a*b!

顺便提一下,const objects(对象)在实际程序中最经常出现的是作为这样一个操作的结果:passedby pointer- or reference-to-const(以传指针或者引用给 const 的方式传递)。

void print(const TextBlock& ctb) // in this function, ctb isconst
{
std::cout<< ctb[0]; // calls const TextBlock::operator[]
...
}

 

virtual ~CPerson();

class CStudent:public CPerson

CPerson * poCPerson = new CStudent; //构造一个CStudent的动态对象

delete poCPerson; 通过基类的指针去销毁派生类的动态对象,没有virtual调用CPerson析构可以,但是调用CStudent析构则会失败。

 

virtual void close() = 0;纯虚函数,包含纯虚函数的类:抽象类

 

 

一个game 的实现:

 基类:CSprite成员包含x,y坐标,宽高,active是否为活着,Create(int w, int h, BOOL active )时传入坐标。BitBlt( LPDIRECTDRAWSURFACE bmp ){ m_bmp = bmp; }贴图,Draw画出来。HitTest

bool hittest(CSprite &sprite)是否相撞。CSprite作为角色的公共类,包括了基本的元素。

CBullet 子弹类继承于CSprite,扩展的成员包括DIRECTIONspeed速度等,扩展的成员函数Move

CTank 类。

         voidCreate( int w, int h, BOOL active )

         {

                   CBullet::Create(w, h, active );子类调用父类的函数。

                   m_bore.Create(32, 32, TRUE );

         }       

 

 

 

class IInterface : public virtual RefBase

{

public:

           IInterface();

           sp<IBinder>        asBinder();IBinder是远程对象的基本接口

           sp<const IBinder>  asBinder() const;

           

protected:

   virtual                    ~IInterface();

   virtual IBinder*           onAsBinder() = 0;

};

asBinder是封装了onAsBinder的,而onAsBinder是纯虚函数,

RefBase 类作为基类起引用计数作用。

 

IBinder 主要作用函数:transact()