- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
考虑以下示例:
typedef struct Collection
{
...
} Collection;
typedef struct Iterator
{
Collection* collection;
} Iterator;
Iterator 提供集合修改函数,因此它持有非常量集合的地址。但是,它还提供非修改函数,这些函数与 const 集合一起使用是完全合法的。
void InitIterator(Iterator* iter, Collection* coll)
{
iter->collection = coll;
}
void SomeFunction(const Collection* coll)
{
// we want to use just non-modifying functions here, as the Collection is const
Iterator iter;
InitIterator(&iter, coll); // warning, call removes const qualifier
}
我正在寻找 C 的解决方案。我确实看到了一些选项:
1. 在 Init 中,将 Collection 转换为非常量。这可能不是未定义的行为,因为对象最终不应该被修改。但这是令人毛骨悚然的,因为有一个 const 对象,这样做是自找麻烦。迭代器将成为一种广泛使用的通用机制来处理集合。在修改常量集合时没有编译器警告真的很糟糕。
2. 两种迭代器类型,一种是具有 const Collection* 成员的只读版本。这使使用变得复杂,可能需要重复某些功能,可能由于翻译步骤而降低效率。我真的不想让 API 复杂化,并且有两个不同的结构和两组函数。
3. Iterator 有两个指针,Init 有两个 Collection 指针。
typedef struct Iterator
{
const Collection* collectionReadable; // use this when reading
Collection* collectionWritable; // use this when writing
} Iterator;
当拥有一个 const 集合时,非 const 参数必须变为 NULL,最终尝试修改该集合会崩溃(尝试取消引用 NULL 指针),这很好(安全)。我们有额外的存储成本。这很尴尬,取同一个集合的两个指针。
我也有点担心编译器在同一上下文中看到两个指针,这意味着如果通过可写指针修改集合,编译器必须意识到只读指针可能指向同一个对象并且尽管有 const 限定符,它仍需要重新加载。这样安全吗?
您会选择哪一个,为什么?您知道解决此问题的更好方法吗?
最佳答案
是的,有两个指向同一个对象的指针是安全的,一个是常量,另一个是非常量。 const 仅表示不能通过该特定指针修改对象,但如果存在此类指针,则可以通过其他指针对其进行修改。然而,虽然它是安全的,但这并不一定意味着你应该选择拥有两个指针的解决方案。
有关完美运行的代码示例,请参阅:
int x = 5;
const int *p = &x;
printf("%d\n", *p);
x = 7;
printf("%d\n", *p);
现在 *p 改变了,即使 p 是一个 const 指针。
您的目标是避免代码重复,因此您只需将 const 指针转换为非常量指针。只要您不修改对象,它就是安全的。 C 标准库中有很多类似的例子。例如,strchr() 将一个 const char 指针放入字符串中,然后返回一个 char 指针,以防万一字符串不是 const 并且您想通过返回值修改它。我会选择 C 标准库中采用的解决方案,即类型转换。
您基本上已经注意到 C 中的 const 限定符并不完美。当您遇到这样的问题时,有很多用例,最简单的方法通常是接受它并不完美并进行类型转换。
关于c - 当 super 结构引用非常量时如何使用 const C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29183003/
标记为家庭作业,因为这是我写的期中问题,但我不明白答案。我被要求在以下语句中解释每个 const 的用途: const char const * const GetName() const { ret
const int* const fun(const int* const& p) const; 我试图弄清楚这个给定函数原型(prototype)的输入参数。我在这两个之间争论,不确定哪个是正确的。
下面的代码用于在同时存在 const 和非 const getter 时减少代码重复。它从非 const 创建 const 版本。我搜索了一下,很多人说我应该从 const 创建非 const 版本。
据我所知,TypeScript 查看了 const string变量作为一个不可变的类型变量,只有那个值,没有其他可能的值。一直以为加as const那是多余的。 为什么我在示例的第二部分得到以下内容
我有一个具有以下签名的方法: size_t advanceToNextRuleEntryRelatedIndex( size_t index, size_t nStrings, char const
首先,有什么区别: (1) const char* (2) char const* (3) const char const* 我相当确定我完全理解这一点,但我希望有人能具体地给我一个句子,这样它就会
这里是新手! 我正在阅读一段代码,我看到作者经常写一个成员函数作为 const int func (const scalar& a) const // etc 你看这里有三个const,现在我明白了中
我总是搞乱如何正确使用 const int*、const int * const 和 int const *。是否有一套规则来定义你可以做什么和不能做什么? 我想知道在赋值、传递给函数等方面所有该做和
我见过人们将 const 用作函数参数的代码。使用 const* 与 const * const 有什么好处?这可能是一个非常基本的问题,但如果有人能解释一下,我将不胜感激。 Bool IsThisN
我总是搞乱如何正确使用 const int*、const int * const 和 int const *。是否有一套规则来定义你可以做什么和不能做什么? 我想知道在赋值、传递给函数等方面所有该做和
这个问题在这里已经有了答案: What is the difference between const int*, const int * const, and int const *? (23 个
如果引用的对象不是 const 对象,那么引用“const”关键字的目的是什么? r1 和 r2 的作用(如下)有什么不同吗? int i = 42; // non const object cons
friend 让我解释原因 const const const const const int const i = 0; 是有效的语法。我拒绝对这个话题有任何想法。虽然我很好奇它是否只是语法问题? 编
我总是搞砸如何正确使用 const int*、const int * const 和 int const *。是否有一套规则来定义你能做什么和不能做什么? 我想知道在分配、传递给函数等方面的所有注意事
常量在 const char* push(const char * const &&_data); 表示无法更改引用的内容。为什么我不能将 const char* 传递给 push? 最佳答案 您的代
我有一个关于在函数参数中涉及指针的最佳实践以及它们是否应该指定为 *const 的问题或 const *const .我知道对于 const 的使用或过度使用存在不同的意见。 ,但至少有一些用途是捕捉
我目前正在为我的类(class)写一个作业,它应该充当一个非常基本的外壳。我快完成了,但是我遇到了 execvp 和我的参数字符数组的问题。这是我的代码的一小段。 //Split the left c
所以,我知道了char const *、char * const 和char const * const 之间的区别。那些是: char* the_string : I can change the
我正在运行一些示例程序以重新熟悉 C++,我遇到了以下问题。首先,这里是示例代码: void print_string(const char * the_string) { cout << t
我正在为系统中的编译错误而苦苦挣扎,这是代码 struct Strless : public binary_function { public : bool operator()(cons
我是一名优秀的程序员,十分优秀!