检查C++; 我只不过是用C++和AM在C++中遇到了一些不熟悉的问题。
假设我在C中有一些类似的函数,这将是非常典型的:检查C++; 我只不过是用C++和AM在C++中遇到了一些不熟悉的问题。,c++,object,null,C++,Object,Null,假设我在C中有一些类似的函数,这将是非常典型的: int some_c_function(const char* var) { if (var == NULL) { /* Exit early so we don't dereference a null pointer */ } /* The rest of the code */ } 假设我正试图用C++编写一个类似的函数: int some_cpp_function(const some_objec
int some_c_function(const char* var)
{
if (var == NULL) {
/* Exit early so we don't dereference a null pointer */
}
/* The rest of the code */
}
假设我正试图用C++编写一个类似的函数:
int some_cpp_function(const some_object& str)
{
if (str == NULL) // This doesn't compile, probably because some_object doesn't overload the == operator
if (&str == NULL) // This compiles, but it doesn't work, and does this even mean anything?
}
基本上,我所要做的就是防止在使用NULL调用某个函数时程序崩溃
-
< > >用对象C++(不涉及重载<代码>=< /Cuth>运算符)> 最典型/常见的方法是什么?
- 这是正确的方法吗?也就是说,我应该不写以对象为参数的函数,而是写成员函数吗?(即使如此,请回答原问题)
- 一个函数引用一个对象,或者一个函数引用一个C风格的指针指向一个对象,有没有理由选择一个而不是另一个
无法使用NULL调用函数。拥有引用的目的之一是,它将始终指向某个对象,因为在定义它时必须初始化它。不要将引用视为一个奇特的指针,而应将其视为对象本身的别名。这样就不会出现这种类型的混淆。C++引用自然不能为null,您不需要检查。只能通过向现有对象传递引用来调用该函数。引用不能为NULL。该接口使您将真实对象传递到函数中 因此,不需要测试NULL。这是引用引用到C++中的原因之一。
注意,您仍然可以编写一个接受指针的函数。在这种情况下,仍然需要测试NULL。如果该值为NULL,那么您可以像在C中一样提前返回。注意:当指针为NULL时,您不应该使用异常。如果一个参数不应该为null,那么你就创建一个使用引用的接口。 一个C++引用不是指针,也不是java/c样式引用,不能为null。它们的行为就像它们是另一个现有对象的别名一样 在某些情况下,如果代码中有bug,您可能会得到一个对已经死了或不存在的对象的引用,但您能做的最好的事情是希望程序很快就死了,以便能够调试发生的事情以及为什么程序会损坏
也就是说,我看到过代码检查“空引用”的操作,例如:
if(&reference==0)
,但是标准很清楚,在格式良好的程序中不能有空引用。如果引用绑定到空对象,则程序格式错误,应予以更正。如果需要可选值,请使用指针(或更高级别的构造,如boost::optional
),而不是引用。正如大家所说,引用不能为空。这是因为,引用引用了一个对象。在代码中:
// this compiles, but doesn't work, and does this even mean anything?
if (&str == NULL)
您正在获取对象的地址str
。根据定义,str
存在,因此它有一个地址。因此,它不能是NULL
。因此,从语法上讲,上述情况是正确的,但从逻辑上讲,if
条件总是错误的
关于你的问题:这取决于你想做什么。是否希望函数能够修改参数?如果是,请传递一个参考。如果不是,则不要(或将引用传递到const
)。有关详细信息,请参阅
一般来说,C++中,大多数人通过指针都是通过引用的。其中一个原因正是您发现的:引用不能为NULL
,从而避免了在函数中检查它的麻烦
-
使用C++对象(不涉及重载=操作符)的最典型的通用方法是什么?
- 这是正确的方法吗?我应该不写以对象为参数的函数,而是写成员函数吗?(即使如此,请回答原来的问题。)
- 一个函数引用一个对象,或者一个函数引用一个C风格的指针指向一个对象,有没有理由选择一个而不是另一个
int silly_sum(int const* pa=0, int const* pb=0, int const* pc=0) {
/* Take up to three ints and return the sum of any supplied values.
Pass null pointers for "not supplied".
This is NOT an example of good code.
*/
if (!pa && (pb || pc)) return silly_sum(pb, pc);
if (!pb && pc) return silly_sum(pa, pc);
if (pc) return silly_sum(pa, pb) + *pc;
if (pa && pb) return *pa + *pb;
if (pa) return *pa;
if (pb) return *pb;
return 0;
}
int main() {
int a = 1, b = 2, c = 3;
cout << silly_sum(&a, &b, &c) << '\n';
cout << silly_sum(&a, &b) << '\n';
cout << silly_sum(&a) << '\n';
cout << silly_sum(0, &b, &c) << '\n';
cout << silly_sum(&a, 0, &c) << '\n';
cout << silly_sum(0, 0, &c) << '\n';
return 0;
}
int-sum(int-const*pa=0,int-const*pb=0,int-const*pc=0){
/*最多取三个整数并返回所有提供值的总和。
为“未提供”传递空指针。
这不是一个好代码的例子。
*/
如果(!pa&&(pb | | pc))返回愚蠢的金额(pb,pc);
如果(!pb&pc)返回愚蠢的金额(pa,pc);
如果(pc)返回总值(pa,pb)+*pc;
如果(pa&pb)返回*pa+*pb;
如果(pa)返回*pa;
如果(pb)返回*pb;
返回0;
}
int main(){
INTA=1,b=2,c=3;
cout在以下引用的情况下,可以使用特殊指定的对象作为空对象:
class SomeClass {
public:
int operator==(SomeClass &object) {
return (this == &object);
}
static SomeClass NullObject;
};
SomeClass SomeClass::NullObject;
void print(SomeClass &val) {
if(val == SomeClass::NullObject)
printf("\nNULL");
else
printf("\nNOT NULL");
}
+1,特别是在指针为空时不引发异常。有时,接口采用非空指针而不是引用是合适的。例如,如果接口将获得指向的对象的所有权。或者在处理C字符串时,例如std::string,则在不同位置需要非空指针。Omn我个人不同意,我不相信在这种情况下使用指针会给你带来任何好处,除了错误地向呼叫者指出p