0

我是一名学生,学习 C++ 并发编程。我想知道如何通过我的 C++ 程序访问图形卡芯片和声卡芯片的功能。有没有另一种方法可以在不使用外部库(如 OpenGL)的情况下连接各自的驱动程序和我的应用程序, OpenAL 等。你能通过一个例子简要描述一下解决方案吗?谢谢你。

4

2 回答 2

11
const int * const function_name(const int * point) const;
//(1)       (2)                 (3)                (4)

第一个防止返回的指针被用来修改函数正在访问的任何数据。这很好(除非您想修改它),因为它可以防止意外修改共享数据。

第二个防止调用者修改返回的指针。这在返回内置类型(如指针)时无效,并且在返回类类型时可能很糟糕,因为它禁止移动语义。

第三个防止函数修改数据。出于与第一个相同的原因,这很好(在适当的时候)。

第四个防止函数修改对象的(非可变)状态。这很好(在适当的时候),因为它允许在const对象上调用函数,并且更容易跟踪对象何时可能更改。

const int * const Functiontwo(const int * const &) const;
//                                        (5)

这里唯一的新东西是通过const引用传递指针。这样做没有意义。按值传递给出了相同的语义,并且不那么冗长并且可能更有效。对于大型或复制成本高的类型,通过const引用传递比通过值传递更有效。

一个细微的变化是传递一个const值:

const int * const Functiontwo(const int * const) const;
//                                        (6)

这对调用者没有兴趣(事实上,函数可以在不改变含义的情况下声明或不声明);所以把它放在声明上没有意义,只是放在定义上。这意味着指针不能在函数内改变。这可能很好(声明局部变量const也可以),因为它可以使函数实现更容易遵循。

于 2013-08-26T11:30:39.423 回答
1

const成员函数后表示该函数不修改父对象的状态:

struct foo
{
    int bar() const; // does not modify the instance of foo
    int & bar(); // might modify the instance of foo
};

在您的示例中,您的函数返回

int const * const

第一个const意味着,int你所指向的不能被改变;您告诉您的用户他可以读取该值,但不能修改它。这也与const正确性有关:

int const * foo() const; // can be used from const functions
int * foo(); // cannot be used from const function

第二个const意味着指针本身是const,这意味着:

int * ptr = &a;
*ptr = 42; // valid
ptr = &b; // valid

int const * ptr = &a;
*ptr = 42; // INVALID
ptr = &b; // valid

int * ptr const = &a;
*ptr = 42; // valid
ptr = &b; // INVALID

int const * ptr const = &a;
*ptr = 42; // INVALID
ptr = &b; // INVALID

将指针本身const作为函数的返回值几乎没有用处。

对于引用,C++03 的快速指南是,如果要修改对象,则要通过引用传递,并希望修改保持不变;如果您想修改对象但不希望修改粘贴(制作副本),或者(例外!)如果您传递的值是 POD 类型,则按值传递;如果您不需要修改非 POD 类型,则通过常量引用传递,从而为自己节省复制成本:

void foo(int & a); // changes to a are applied to a itself, no copy made
void foo(int a); // changes to a are applied to a copy of a, copy made
void foo(std::string const & a); // no changes allowed, no copy made
于 2013-08-26T11:42:39.253 回答