C与C++易混乱的点 总结

来源:互联网 发布:西安软件行业成都 编辑:程序博客网 时间:2024/06/05 16:12
一、引用 和用 指针
在c++函数中,形式参数用 引用 和用 指针都可以起到在被调用函数中改变调用函数的变量的作用。什么时候用引用作参数什么时候用指针作参数呢 void function (int *ptr); void function(int &ref);
没有 特定的规定。。 学的 久了,就 会习惯什么时候用指针什么时候用引用了 引用指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针
C++中尽量用引用。 个人觉得所有的引用都可以用指针,但指针引用容易出错。
引用当然更直观更直接,做参数时,如果在函数内不刻意要用指针的那些副作用(如越界访问,动态定向什么的),引用可以代替指针
C++ 中一般都用引用就可以了 ... C 中没有引用,就使用指针 ....
举例如下: 1 使用指针传递参数时: void function (int *ptr) { 函数体;} 调用该函数时 main() { int p; function (&p); } 2 使用引用传递参数时: void function(int &ref) { 函数体;} 调用该函数时 main() { int p; function (p); } 由此可见,使用引用比使用指针传递参数函数调用时更简单,引用指针功能大体相同,但是有空间分配时建议最好使用指针,因为在释放空间时,对指针只需要delete就行了,而引用是不能删除空间的,引用必须指向一个存在的对象。
指针引用的差别 1. 非空的差别任何情况下都不能使用指向空值的引用.一个引用必须总是指向某个对象. 不存在的指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高. 2. 合法性区别在使用引用之前不需要测试他的合法性.指针必须测试. 3. 可修改区别 指针可以被重新赋值给另一个不同的对象.但是引用总是指向在初始化的时候被制定的对象,以后不能改变.但是指定的对象其内容可以改变. 应该使用指针的情况: 可能存在不指向任何对象的可能性 需要在不同的时刻指向不同的对象(此时,你能够改变指针的指向) 应该使用引用的情况: 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,使用此时应使用引用。
要首先好好理解指针引用的区别
指针引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?

  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用

  “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”

  char *pc = 0; // 设置指针为空值

  char& rc = *pc; // 让引用指向空值

  这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。

  因为引用肯定会指向一个对象,在C里,引用应被初始化。

  string& rs; // 错误,引用必须被初始化
  string s("xyzzy");
  string& rs = s; // 正确,rs指向s

  指针没有这样的限制。
  string *ps; // 未初始化的指针
            // 合法但危险

  不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

  void printDouble(const double& rd)
  {
   cout << rd; // 不需要测试rd,它
  }       // 肯定指向一个double值

  相反,指针则应该总是被测试,防止其为空:

  void printDouble(const double *pd)
  {
   if (pd)
   {// 检查是否为NULL
    cout << *pd;
   }
  }

  指针引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。

  string s1("Nancy");
  string s2("Clancy");

    string& rs = s1; // rs 引用 s1
  string *ps = &s1; // ps 指向 s1
  rs = s2; // rs 仍旧引用s1
          // 但是 s1的值现在是"Clancy"

    ps = &s2; // ps 现在指向 s2;// s1 没有改变

  总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用

  还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。

  vector<int> v(10); //建立整形向量(vector),大小为10
                    //向量是一个在标准C库中的一个模板
  v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值

  如果操作符[]返回一个指针,那么后一个语句就得这样写:

  *v[5] = 10;

  但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用
  当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针 。
 
指针引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”)
二、sizeof() strlen();
Char str[] = “hello world”;
sizeof()为12 strlen()为11
三、const
const float pi=3.1415926;
也可以这样写
float const pi=3.1415926;
而对于指针const在指针的左边或右边有不同的含义,const在指针左边表示所指的东西
是常量,例如:const char *str或者这么写char const都是表示foo是不能改变的,不能对其改变内容*str="foo";="foo";
const在*右边的情况,这种情况表示指针不允许改变,例如:
char * const这样被我限制了,不可以的。
这时编译会出现,assignment of read-only variable `str,看连指针本身都不能改变了。str
="foo";
str="XIXI"; //haha
四、const   static    
const 说明它是个值不能改变的常量   
  static说明它是个静态变量:如果在函数内,在类里面,则函数的每一个实例,类的每一个对象,都共享这同一个变量。如果是全局量,则说明在其他文件编译的时候,它是不可见的(可以避免名字命名的冲突)。
static   const   int   i   =   100;  或
const   永远不变   
  static   能保存变化
static const 和const static 有啥区别?如何初始化类中的这种类型的变量
没有区别。   
  一个是静态常量,   
  一个是常量静态,   
  静态都将存储在全局变量区域,其实最后结果都是一样的。   
  可能在不同编译器内,不同处理,但是最后结果是一样的。

http://blog.csdn.net/limi0066/article/details/1659205