c++知识(1)

内联函数:可以避免函数调用的开销;内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

typedef:在类内typedef,目的是使得类的数据成员类型更加清晰、易懂,从而更好理解其想要表达到意图。或者说,是一种更好的封装形式,这个typedef是类内部可见;

typedef int integer;
typedef float fl;
这样的话,在下面声明类数据成员时,就可以:
integer TotalNumber;
当然,对于简单的数据类型,似乎有些多此一举 
不过,对于复杂的数据类型,我们通过typedef给它一个更有意义的名称,不是更好吗!

typename:class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>.....  
在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:       template<typename T>......
在模板定义语法中关键字class与typename的作用完全一样。
typename难道仅仅在模板定义中起作用吗?其实不是这样,typename另外一个作用为:使用嵌套依赖类型:

  class MyArray      
   {      
   public:
       typedef   int   LengthType;
       .....
   }

   template<class T>
   void MyMethod( T myarr )  
   {          
       typedef typename T::LengthType LengthType;        
       LengthType length = myarr.GetLength;  
   }
这个时候typename的作用就是告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有typename,编译器没有任何办法知道T::LengthType是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。

函数指针与指针函数

explicit:可以有效防止构造函数的隐式转换带来的错误或者误解;

static:

不能通过类名调用非静态成员函数;

静态成员函数不能调用非静态成员,反之可以;

静态成员变量使用前应该初始化,静态数据成员实际上是类域中的全局变量,所以,静态数据成员的定义(初始化)不应该被放在头文件中;

静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员;

静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以;

静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用;

静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存;

静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存;

class base{ 
static int func1(); 
int func2(); 
}; 
int (*pf1)()=&base::func1;//普通的函数指针 
int (base::*pf2)()=&base::func2;//成员函数指针

指针传递、引用传递:

相同点:都是地址的概念

不同点:

  ●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

  ●引用没有const,指针有const,const的指针不可变;

  ●引用不能为空,指针可以为空;

  ●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

  ●指针和引用的自增(++)运算意义不一样;

  ●引用是类型安全的,而指针不是 (引用比指针多了类型检查

引用的作用:

1、传递可变参数

2、给函数传递大型对象
当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的
副本,也就是参数传递时,对象无须复制

3、引用返回值:如果一个函数返回了引用,那么该函数的调用也可以被赋值。这里有一函数,它拥有两个引用参数并返回一个双精度数的引用:

double &max(double &d1,double &d2)
{
return d1>d2?d1:d2;
}
由于max()函数返回一个对双精度数的引用,那么我们就可以用max() 来对其中较大的双精度数加1:
max(x,y)+=1.0;

copy构造函数为什么使用引用传递参数

c++关键字auto:

c++11特性

posted @ 2014-09-04 13:23  chengcy  Views(180)  Comments(0)    收藏  举报