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

本文是关于Visual C++编程的读书笔记,涵盖了&&与&的区别、单例模式的实现、类对象与指针对象的生命周期、delete与delete[]的操作差异、静态成员的初始化、内存管理和类型转换等内容,还探讨了函数重载、局部域函数、函数指针以及类的静态成员和常成员函数的使用。
摘要由CSDN通过智能技术生成

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++;
}
//引用即改变了原来数组的指针


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值