我是一名学生,学习 C++ 并发编程。我想知道如何通过我的 C++ 程序访问图形卡芯片和声卡芯片的功能。有没有另一种方法可以在不使用外部库(如 OpenGL)的情况下连接各自的驱动程序和我的应用程序, OpenAL 等。你能通过一个例子简要描述一下解决方案吗?谢谢你。
2 回答
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
也可以),因为它可以使函数实现更容易遵循。
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