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