C++易混乱的点总结

 
一、 引用 和用 指针
在 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 有啥区别?如何初始化类中的这种类型的变量
没有区别。  
  一个是静态常量,  
  一个是常量静态,  
  静态都将存储在全局变量区域,其实最后结果都是一样的。  
  可能在不同编译器内,不同处理,但是最后结果是一样的。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值