我有一篇文章,但我失去了它.它展示并描述了一些人们应该小心的C/C++技巧.其中一个让我感兴趣,但现在我正在尝试复制它,我无法将其编译.
这个概念是可以随意改变constC/C++ 中a的值
它是这样的:
const int a = 3; // I promise I won't change a
const int *ptr_to_a = &a; // I still promise I won't change a
int *ptr;
ptr = ptr_to_a;
(*ptr) = 5; // I'm a liar; a is now 5
Run Code Online (Sandbox Code Playgroud)
我想向朋友展示这个,但现在我错过了一步.有谁知道它开始编译和工作缺少什么?
ATM我从'const int*'到'int*'的转换无效,但是当我读到我试过的文章时,它运行得很好.
考虑这个功能:
Thing func(){
return something;
}
Run Code Online (Sandbox Code Playgroud)
每次调用此函数时,都会生成一个副本something并传递给调用者.
我的问题是,为什么不这样做(每次我想按价值归还)?
const Thing& func(){
return something;
}
Run Code Online (Sandbox Code Playgroud)
这样,我们就没有冒充无法复制的风险something.如果客户端只需要"读取" something而不是"写入"它,那么const引用就可以完全实现.如果客户端确实需要副本,它可以简单地将const引用分配给变量,例如:
Thing thing = func(); // the object is passed by const reference, and then copied.
Run Code Online (Sandbox Code Playgroud)
那么,有没有理由简单地按价值回报?
顺便说一句,并不是因为我非常关心优化,只是因为我没有理由单纯地通过价值来回报.
跟进问题:阅读答案,我知道每种方法都有利弊.有违约吗?例如"默认按值返回"?或者它纯粹基于具体案例?
我有这样的事情:
class Bar
{
public:
pair<string,string> one;
std::vector<string> cars;
Bar(string one, string two, string car);
};
class Car
{
public:
string rz;
Bar* owner;
Car(string car, Bar* p);
};
class Foo
{
public:
Foo ( void );
~Foo ( void );
int Count ( const string & one, const string & two) const;
int comparator (const Bar & first, const Bar & second) const;
std::vector<Bar> bars;
};
int Foo::comparator(const Bar & first, const Bar & second) const{
return first.name < …Run Code Online (Sandbox Code Playgroud) 当我尝试将const-correctness应用于我自己的代码时,我经常需要const在其他模块中添加资格(由其他程序员编写)以便在我自己的代码中使用这些函数.(参见补丁修正的正确性)
我一直认为如果一切都编译得很好,这可能会导致功能损坏,因为const标签只在编译时很重要.
然而,有一天,我的一位同事坚持要在我提交添加const标签的代码之前重新运行所有自动化测试,我认为编译这些代码就足够了.
他有意见吗?有没有办法应用const-correctness可能破坏现有的功能?
编辑:重要的是要注意,通常,我只需要为函数的指针参数执行此操作(例如Something getSomething(Object* pObj),Something getSomething(const Object* pObj)我不更改返回类型或方法常量,因为这不是客户端代码的问题.
例如,这就是我写它的方式,它编译并且工作得很好:
template<typename T> struct is_pointer<T*> {
static const bool value = true;
}
Run Code Online (Sandbox Code Playgroud)
那么为什么有些人写的不太明显
template<typename T> struct is_pointer<T*> {
enum { value = true };
}
Run Code Online (Sandbox Code Playgroud)
代替?是不是因为static const变量使用了一个字节的内存,而enum不是?
C++ 11给了我们std::add_const; 使用C++ 17,我们有了一个新的结构 - std::as_const().前者只是const在你提供的类型之前添加了一个.第二个是函数的正确(模板),而不是类型特征,它似乎也是一样 - 除了类型是rvalue-reference时,在这种情况下它不能被使用.
我不太明白提供的动机std::as_const().为什么我们除此之外还需要它std::add_const?
我有一个没有构造函数的抽象C++类.它应该是一个基类,所以其他类可以继承它.我想要做的是在基类中声明一个常量变量,并在每个派生类的构造函数中初始化它,但在每个类中没有其他地方.它在C++中是否合法?如果是这样,我该怎么做?
我试着编写自己的strchr()方法实现.
它现在看起来像这样:
char *mystrchr(const char *s, int c) {
while (*s != (char) c) {
if (!*s++) {
return NULL;
}
}
return (char *)s;
}
Run Code Online (Sandbox Code Playgroud)
最后一行原来是
return s;
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为s是const.我发现需要这个演员(char*),但老实说我不知道我在那里做什么:(有人可以解释一下吗?
我还在学习C++,我到处都在阅读,我必须尽可能地使用const它(出于速度原因,我认为).
我经常写这样的getter方法:
const bool isReady() {
return ready;
}
Run Code Online (Sandbox Code Playgroud)
但我已经看到一些IDE以这种方式自动生成getter:
bool getReady() const {
return ready;
}
Run Code Online (Sandbox Code Playgroud)
但是,写代表,如果const在函数之后,我发现这个错误:
member function 'isReady' not viable: 'this' argument has type 'const VideoReader', but function is not marked const
Run Code Online (Sandbox Code Playgroud)
那么,编写const getter的更好方法是什么?我真的要关心吗?
在Kyle Simpson的新标题中,你不了解JS:ES6及更高版本,我找到以下代码片段:
警告将对象或数组指定为常量意味着在该常量的词法范围消失之前,将无法对值进行垃圾回收,因为对该值的引用永远不会被取消.这可能是可取的,但如果不是你的意图,要小心!
(摘录自:Simpson,Kyle."你不了解JS:ES6及其他."O'Reilly Media,Inc.,2015-06-02.iBooks.这些材料可能受版权保护.)
据我所知,他没有对此进行扩展,而且谷歌上的10分钟没有任何结果.这是真的,如果是这样,"对价值的引用永远不会被取消"的含义究竟是什么意思?我养成了宣称不会改变的变量的习惯const,这是真正的具体性能/记忆术语中的坏习惯吗?
const ×10
c++ ×8
function ×2
c ×1
c++17 ×1
compilation ×1
constructor ×1
ecmascript-6 ×1
enums ×1
getter ×1
inheritance ×1
javascript ×1
member ×1
non-static ×1
pointers ×1
rationale ×1
reference ×1
static ×1
strchr ×1
templates ×1
testing ×1
type-traits ×1