1,C++ 是一种静态类型的语言,在使用变量前,必须先定义其类型。在编译时会做类型检查,在编写c++表达式的时候,编译器会检查表达式中所用的对象类型是不是之前给其定义的类型,或能否转换为之前给其定义的类型。所以,C++ 的这种静态类型检查,能帮助开发者更早的发现错误。
2,左值可以出现在赋值语句的左边和右边。
右值只能出现在赋值语句的右边。
3,变量(即对象)是内存中具有类型的区域。变量是否自动初始化取决于变量定义的位置:函数体外的变量自动初始化为0,函数体内的变量不会自动初始化。
类类型变量(类对象)的初始化时通过定义类的构造函数实现的。
4,const 对象不能赋给非const引用:
const int val1 = 10;//ok
const int& val2 = val1;//ok
int& val3 = val1;//error cannot convert from 'const int' to 'int &'
int val4 = val1;//ok
所谓“引用”是指指向const对象的引用。因为val3是非const引用,所以可以修改val3指向的对象的值。当val1赋给val3时,如果是合法的那么val1指向的对象将不可以被改变,这个val1的定义不相符。
5,派生类的对象只能访问基类的public成员。那么 当派生类protect继承基类时,就不能把派生类的对象赋给基类的指针。即 Base *abj = new Child();是不可以的。因为在protect继承时,基类的public和protect成员在派生类看来都是protect成员。
6,C++的异常处理包括:
(1)throw表达式:由throw关键字和尾随的表达式组成,通常以分号结束。throw表达式的类型决定了抛出异常的类型。
(2)try块:以一个try关键字开始,以一个或多个catch字句结束。
(3)由标准库定义的一组异常类,用在throw和相应的catch之间传递相关的错误信息。
异常处理简单示例:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
const char* func(const char* x,const char* y)
{
if (strcmp(y,"00"))
{
throw y;
}
return y;
}
int _tmain(int argc, _TCHAR* argv[])
{
const char* res;
try
{
res = func("2","3");
throw("the first error");
cout<<"the result is "<<res<<endl;
res =func("33","00");
}
catch(int)
{
int aa = 0;
}
catch(double)
{
cout<<"error for dividing zero"<<endl;
exit(1);
}
catch(const char*)
{
int aa = 0;
}
return 0;
}
7,函数不应该有vector或其他容器类型的形参,调用含有普通的非引用类型的vector形参,函数会复制一遍vector中的每个元素。正确的做法是将形参声明为引用类型或通过传递指向容器中需要处理的元素的迭代器来传递容器。
8,内联函数:代码量很小,且经常被调用的函数。内联函数应该在头文件中定义。缺点:调用函数比求解表达式慢的多。inline函数可以在程序中定义多次,但是在每个源文件中的定义都必须是完全相同的,在头文件中加入或修改inline函数时,和此头文件相关的源文件都必须重新编译。