读书笔记 Visual C++ 编程之道(二)

来源:互联网 发布:stereonet软件百度云 编辑:程序博客网 时间:2024/05/29 13:56

1、&& 运算符 和 & 运算符相比效率高,因为&两边都要进行运算,| 和 || 也是同理的。&& 和 || 有短路运算符这一称呼。

2、单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的动机:如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。

C++单例模式示例:

class CSingleton {private:    CSingleton()    {            }public:    static CSingleton *GetInstance()    {        static CSingleton *m_pInstance;        if(m_pInstance==NULL)        {            m_pInstance=new CSingleton();        }        return m_pInstance;    }};


3、单例模式说明类中能创建私有的构造方法

4、普通的类对象在其离开作用范围释放,但是对于类的指针对象只有当整个应用程序关闭后才会被释放。

5、delete 和 delete[] 不同点是: 前者删除普通的指针空间,后者删除数组类型的指针空间,如果调用delete删除数组类型指针空间,只会删除第一个元素的空间。

6、一定记得程序开发时不要自己计算某个结构体的大小,赢调用sizeof计算结构体的大小。

7、实现两个类互为成员变量可以用一下的方法

class B;class A{public:  B* m_pB;};class B{public:  A m_a;};

8、在指定的内存位置创建对象得分方法

#include<iostream>using namespace std;class Test{public:    Test()    {        cout<<"创建"<<endl;    }    ~Test()    {        cout<<"释放"<<endl;    }    char *getName()    {        return "Test";    }};int main(){    char *buff = new char[sizeof(Test)];    Test *pTest=new (buff) Test;//在指定的内存地址创建对象    cout<<((Test*)buff)->getName()<<endl;//调用对象    cout<<pTest->getName()<<endl;    pTest->~Test();//释放对象,因为对象是指针类型,并不会自己调用析构方法    cout<<"done"<<endl;    delete []buff;//删除缓冲区    return 0;}

9、C++ 多线程学习的一片文章  http://blog.csdn.net/hitwengqi/article/details/8015646

10、常量方法修改类成员的示例

class CTest{private:    mutable int m_Height;public:    void SetHeight(int Height) const    {        m_Height=Height;    }};


11、如果在类中声明静态成员那么需要在类外对其初始化,否则会报编译错误。

12、free 和 delete释放指针后,应该置指针为空

13、如果担心内存泄露,可以用auto_ptr,但是auto_ptr应用于数组一样会出问题。

14、C++里面的static_cast 关键字能够安全的进行类型转换。int nLen = static_cast<int>(10.5) +10 ;

15、函数的返回值不作为区分重载函数的一部分。对于普通的函数参数来说const关键字不作为区分重载函数的标识。但是参数如果是指针或者引用类型,则const关键字将作为重载函数的标识。参数默认值不能作为区分重载函数的标识。使用typedef自定义类型不作为重载的标识。

16、局部域中的声明的函数将隐藏而不是重载全局域中的函数。如果想在局部域中使用全局域中的函数,需要使用域运算符 ::。

17、函数指针,下面代码定义了一个指向具有两个整形参数的函数指针。

     

int (*ptfun)(int,int);
也可以用typedef来定义一个函数指针类型,然后定义该类型的变量。例如:

typedef int (*ptfun)(int ,int);ptfun fun;

应用如下:

typedef int (*ptfun)(int,int);int sum(int x,int y){    return x+y;}ptfun fun;fun=sum;int ret=fun(10,20);


18、中间略过虚函数的使用、纯虚函数的使用、内联方法的使用、嵌套类的使用、局部类的使用。

19、类的静态数据成员(被所有类对象共享,并且允许使用类名直接访问)

class CBook{public:    static unsigned int m_Price;//定义一个静态数据成员};unsigned int CBook::m_Prince=10;//初始化静态数据成员

20、略过友员类的使用、友员方法的使用。比较简单,好理解。


21、常成员函数只能引用成员变量,而不能修改成员变量。

void ShowHeight() const;//常成员函数的声明//常成员函数的声明和定义都要加上面的const;

22、类模板的使用。

//类模板的应用,有了类模板不同的数据类型可以不用定义不同的方法实现#include<iostream>using namespace std;template <class T>class Calculate  //声明一个模板类{public:    Calculate(T a,T b);public:    T Add();  //声明模板中的两个函数    T SubTraction();private:    T m_a;    T m_b;};template <class T>  //定义模板类的构造函数Calculate<T>::Calculate(T a,T b){    m_a=a;    m_b=b;}template <class T> //定义模板中的加法函数T  Calculate<T>::Add(){    return m_a+m_b;}int main(){    Calculate<int> cal1(20,10);    cout<<cal1.Add()<<endl;    Calculate<float> cal2(20.1,10.3);    cout<<cal2.Add()<<endl;    return 0;}

23、指针的引用作为函数的参数

void TestPtr(int *&pArray){   cout<<pArray[0]<<endl;   pArray++;}//引用即改变了原来数组的指针


0 0
原创粉丝点击