c++ - 当您不取消引用时,指针不只是一个引用吗?

标签 c++ pointers reference

当你不取消引用时,指针不只是一个引用吗?

#include "stdafx.h"
#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>


std::list<int>* user_defined_func( ) {
    std::cout << "BEGIN: user_defined_func" << std::endl;
    std::list<int>* l = new std::list<int>;

    l->push_back(8);
    l->push_back(0);

    std::cout << "END: user_defined_func" << std::endl;

    return l;
}


bool validate_list(std::list<int> &L1)
{

   std::cout << "BEGIN: validate_list" << std::endl;

   std::list<int>::iterator it1 = L1.begin();

   for(; it1 != L1.end(); ++it1)
   {
      if(*it1<= 1){

         std::cout << "Validation failed because an item in the list was less than or equal to 1." << std::endl;
         std::cout << "END: validate_list" << std::endl;
         return false;
       }
   }

   std::cout << "Test passed because all of the items in the list were greater than or equal to 1" << std::endl;
   std::cout << "END: validate_list" << std::endl;
  return true;
}

BOOST_AUTO_TEST_SUITE( test )
BOOST_AUTO_TEST_CASE( test )
{
   std::list<int>* list1 = user_defined_func();
   BOOST_CHECK_PREDICATE( validate_list, (list1) );
}
BOOST_AUTO_TEST_SUITE_END()

在一行中,

BOOST_CHECK_PREDICATE( validate_list, (list1) ); 

上面,有人告诉我不能将指针传递给需要引用的函数。我认为指针(尚未取消引用)只是一个地址(即引用)。我在这里缺少什么?

最佳答案

指针和引用很相似,但在几个方面有所不同:

  1. 他们有不同的访问语法。如果你有 T* aT& b,你可以使用 a->memberb.member< 访问成员变量和函数分别。
  2. 指针可以不指向任何东西,而引用必须始终指向某物。 a = 0 是合法的,但 b = 0 或任何类似的内容都是非法的。
  3. 指针可以“重新定位”(即指针对象可以更改),而引用不能。 a = &b 是合法的,但是 int c; b = c; 不是(但是,T& b = c 是——引用只能在初始化时设置)。 (感谢 Mike D。)
  4. 指针不能引用临时变量,但 const 引用可以。
  5. 指针可以指向其他指针,(T**) 但引用不能引用其他引用(即没有 T&& 这样的东西,尽管请注意 C+ +0x 将使用 T&& 来定义移动语义)。因此,您不能拥有引用数组。 (感谢 AshleysBrain)

有人可能想知道为什么我们有引用,而不是一直使用指针(就像在 C 中)。原因是因为运算符重载或某些运算符。

考虑赋值运算符。如果没有引用,函数语法会是什么?如果它是 T* operator=(T* lhs, T rhs) 那么我们必须这样写:

int a(1);
&a = 2;

本质上,引用允许我们拥有左值函数,而不需要指针引用和解引用语法。

关于c++ - 当您不取消引用时,指针不只是一个引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2326704/

相关文章:

c++ - 在 "for"语句中声明 for 循环的计数器是否更有效?

java - 在文件中从 Java 编写 Long 并在 C++ 中读取它

c# - 从 C++ 工具到……?尝试接触现代工具

c - 指向内存中指针的指针的大小

Php 按值传递对象

ios - 最佳实践?从 segues 传回对象引用

c++ - 派生类不能访问私有(private)成员

c++ - OpenGL Fog不出现

C Incompatible pointer type 消息似乎列出了预期和实际的相同指针类型

c++ - 不使用 `new` 分配指针数组?