检查C++; 我只不过是用C++和AM在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

假设我在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_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。您的函数接受引用,它们不能为NULL

编写函数就像用C编写一样

基本上,我想做的就是 防止程序在运行时崩溃 使用调用某个_cpp_函数() 空


无法使用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++对象(不涉及重载=操作符)的最典型的通用方法是什么?
  • 这是正确的方法吗?我应该不写以对象为参数的函数,而是写成员函数吗?(即使如此,请回答原来的问题。)
否,引用不能为null(除非已经发生未定义的行为,在这种情况下,所有下注都已关闭)。是否应该编写方法取决于其他因素

  • 一个函数引用一个对象,或者一个函数引用一个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