当你不取消引用时,指针不只是一个引用吗?
#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) );
上面,有人告诉我不能将指针传递给需要引用的函数。我认为指针(尚未取消引用)只是一个地址(即引用)。我在这里缺少什么?
最佳答案
指针和引用很相似,但在几个方面有所不同:
- 他们有不同的访问语法。如果你有
T* a
和T& b
,你可以使用a->member
和b.member< 访问成员变量和函数
分别。 - 指针可以不指向任何东西,而引用必须始终指向某物。
a = 0
是合法的,但b = 0
或任何类似的内容都是非法的。 - 指针可以“重新定位”(即指针对象可以更改),而引用不能。
a = &b
是合法的,但是int c; b = c;
不是(但是,T& b = c
是——引用只能在初始化时设置)。 (感谢 Mike D。) - 指针不能引用临时变量,但
const
引用可以。 - 指针可以指向其他指针,(
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/