C++学习笔记

1、case语句内不能定义新的变量,否则会报“XX因为case跳过了初始化”的错误。解决办法是将定义语句放在switch语句之前。


2、碰到只有一个实例的类,可以使用单例模式,模板如下:

class CSingleton
{
private:
	CSingleton() //构造函数是私有的
	{
	}
public:
	static CSingleton * GetInstance()
	{
		static CSingleton *m_pInstance;
		if (m_pInstance == NULL) //判断是否第一次调用
			m_pInstance = new CSingleton();
		return m_pInstance;
	}
};

这样做的好处是方便其他类对它的访问,不用新生成对象和传递值这么麻烦。

3、后缀++的执行顺序是,在当前语句中按原来的值进行运算,在本句结束下句开始的时候执行++。如果返回值是a++类型,那么也是同理


4、当一个函数参数是一个类类型时,它的调用机制是根据实参调用相应的构造函数(包括拷贝构造函数)来生成一个临时对象,例子如下:

#include <iostream>
using namespace std;

class test
{
private:
	int a;
public:
	test(){ a = 0; }
	test(int a)
	{ 
		this->a = a; 
	}
	void print(){ cout << a << endl; }
};

void fun(test f)
{
	f.print();
}
void main()
{
	int a = 1;
	fun(1);
}

2016/8/13  更新理解

C++中, 一个参数的 构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个 构造器 ,2 是个默认且隐含的类型转换操作符。
所以, 有时候在我们写下如 类名 对象名 = 一个数据, 这样的代码, 且恰好数据的类型正好是该类单参数构造器的参数类型, 这时候 编译器就自动调用这个构造器, 创建一个AAA的对象。
这种情况叫做隐式转换,可以在构造函数前加上关键字explicit,这样构造函数就只能显式调用了。

5、下面的这个程序是错的,因为返回了局部变量的地址,该变量会在函数调用结束后被释放,所以这个地址没有意义。

char* f(char * s)
{
	char ch = 'A';
	return &ch;
}

6、error C2555: “B::g”:  重写虚函数返回类型有差异,且不是来自“A::g”的协变

若同名函数在基类中声明为虚函数,那么在子类中要么参数有所区别避开虚函数重写,要么就参数返回类型完全一样完成重写,只有返回类型不同则会报错。若同名函数在基类中不是虚函数,则不会出错。

class A
{
public:
	virtual void f(char a){};
	virtual void g(char a){};
};

class B :public A
{
	void f(int a){};
	int g(char a){};
};


7、VS2013编译错误类型:

warning MSB8003: Could not find WindowsSDKDir variable from the registry.  TargetFrameworkVersion or PlatformToolset may be set to an invalid version number.

解决方法:

重装windows 8.1 SDK,如果网络不行就下载离线包,即可解决。


8、C++11 新特性 右值引用

需要注意的是:

    show(a++);  //右值引用
    show(++a);  //左值引用

a++是先取出持久对象a的一份拷贝,再使持久对象a的值加1,最后返回那份拷贝,而那份拷贝是临时对象(不可以对其取地址),故其是右值;

++a则是使持久对象a的值加1,并返回那个持久对象a本身(可以对其取地址),故其是左值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值