标签: const

C++如何用consts替换#defines

最近我一直在仔细研究我的编程风格以及如何改进它.首先让我说,在我目前的职位上,我是唯一的程序员.结果,我可以把事情做成我想要的hacky,但我真的在努力成为一个更好,更健全的程序员.

另外,我的背景主要是基于C的,基本上在必要时使用C++作为C的超集.结果,我偶然发现了以下难题.

我总是用#define ERROR_FUNCTION_BLEW_UP -2定义错误代码.诚实地说,我可以看到这样做的好处,因为我不需要分配内存来存储-2.但是,在C++中,我可以看到使用const变量的好处,因为两个竞争宏之间的冲突机会较少.

结果,我想知道在C++中实现错误代码的最简洁方法是什么.也就是说,我希望客户端能够通过执行类似于"if(return_value == ERROR_FUNCTION_BLEW_UP)"的操作来检查某些函数的返回值.我已经尝试在每个类中添加一个const变量,但是代码看起来不正确.也就是说,客户端现在检查"if(return_value == MyClass.kErrorFunctionBlewUp_)"行.有没有更简洁的方法来实现这一点,而不是让常数成为班上的公共成员?

另外,要添加到我的问题,myClass是一个基类,现在我想在MyDerivedClass中添加更多错误代码.有什么办法解决这个问题并避免使用宏?

感谢大家的帮助.

c++ const c-preprocessor

0
推荐指数
1
解决办法
139
查看次数

C:使用char*const指针

在下面的程序中,p被声明为一个指针(它是常量BUT字符串不是).但程序仍然无法工作并突然停止说"untitled2.exe已停止工作".

#include<stdio.h>
#include<stdlib.h>

int main(){
    char * const p = "hello";
    *p = 'm';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种意外

c pointers const char

0
推荐指数
2
解决办法
760
查看次数

编译与运行时const变量赋值和在C++中分配vlas

当出现一些问题时,我正在研究一个带有非类型参数的模板函数(以避免数组的动态分配).我的第一个问题是编译时变量赋值.这是因为以下尝试调用模板函数:

template<int n>
int *getDegrees(int A[][n]) {
  //return degrees
}

int main(int argc, char **argv) {
  int n = 10;
  int A[n][n];
  int *degs = getDegrees<n>(A);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们有两个错误:第一,编译器无法解析对以下内容的调用getDegrees(A):

main.cc:27: error: no matching function for call to ‘getDegrees(int [(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)][(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)])’
Run Code Online (Sandbox Code Playgroud)

其次,我们无法n在模板调用中使用,因为它不是常量表达式.简单地n保持不变可以解决问题

const int n = 10;
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做的话

int m = 10;
const int n = m; 
Run Code Online (Sandbox Code Playgroud)

我们得到了同样的错误.虽然编译器可能允许第二个赋值,但它是否被认为是不好的形式?另外,为什么n在解决函数调用时不断有所作为呢?

我的另一个问题是关于vlas:在堆栈或堆上为它们分配的内存(并且这是依赖于编译器的)?即使在C++中允许它们似乎也存在争议,是否应该避免使用向量(或类似的容器)?

欣赏任何见解!

c++ templates const variable-length-array

0
推荐指数
1
解决办法
397
查看次数

如何使函数primitve param const的良好示例将导致编译器优化

我想更好地了解如何更改函数签名:

void foo(double x);
Run Code Online (Sandbox Code Playgroud)

至:

void foo(const double x);
Run Code Online (Sandbox Code Playgroud)

如果我们不修改x里面,可能会导致代表编译器的一些优化技巧.有人可以给我一个具体的具体例子吗?

c++ const compiler-optimization

0
推荐指数
1
解决办法
84
查看次数

为什么我不能从const String&方法返回NULL?

我有以下方法声明: const String& MyClass::GetAspect(const String& strKey) const

在这个方法中,我们决定在做一些事情之前做一个空指针检查; 如果这个方法里面的指针是null,我们只想返回null.

但是,我收到以下错误:

myclass.cpp(222) : error C2440: 'return' : cannot convert from 'int' to 'const String &'
        Reason: cannot convert from 'int' to 'const String'
        No constructor could take the source type, or constructor overload resolution was ambiguous
Run Code Online (Sandbox Code Playgroud)

有人能帮我理解吗?是否有一些我不完全理解的const-correctness概念?

c++ const

0
推荐指数
1
解决办法
554
查看次数

const参数的方法不接受非const参数?

此代码无法编译:

ErrorTolerantSearch e;
e.readStringsFromFile("test.txt");
e.buildQgramIndex(3);
vector<map<uint, uint>*> lists;
lists.push_back(&e._qgramIndex["ret"]); // ignore this, assume container not empty
lists.push_back(&e._qgramIndex["coo"]); // ignore this, assume container not empty
map<uint, uint> resunion = e.computeUnion(lists); // <-- this makes problems
Run Code Online (Sandbox Code Playgroud)

这是标题的一部分

class ErrorTolerantSearch {
 public:
  void readStringsFromFile(string fileName);
  void buildQgramIndex(uint  q);
  map<uint, uint> computeUnion(const vector<const map<uint, uint>*> & lists);
  map<string, map<uint, uint> > _qgramIndex;
};
Run Code Online (Sandbox Code Playgroud)

这是编译器给出的错误:

ErrorTolerantSearchTest.cpp: In member function ‘virtual void ErrorTolerantSearchTest_computeUnion_Test::TestBody()’:
ErrorTolerantSearchTest.cpp:89:50: error: no matching function for call to ‘ErrorTolerantSearch::computeUnion(std::vector<std::map<unsigned int, unsigned int>*>&)’
ErrorTolerantSearchTest.cpp:89:50: …
Run Code Online (Sandbox Code Playgroud)

c++ const parameter-passing pass-by-reference

0
推荐指数
1
解决办法
171
查看次数

c ++常量如何使它们工作

到目前为止,我已经使用DEFINE来声明我的常量.它完美无缺.

我试图在我的类中使用c ++ const关键字,但它给出了编译时错误

  class User{

  public:
     User::User();
  protected:
       const float DATA_Z;

   }
Run Code Online (Sandbox Code Playgroud)

.CPP

 User::User(){

         DATA_Z = 0.0023f;

  }
Run Code Online (Sandbox Code Playgroud)

这是它产生的错误

错误3错误C2758:'User :: DATA_Z':必须在构造函数base/member初始化列表中初始化

如何为其分配数据,以及如何在课堂上使用它们.

c++ oop const

0
推荐指数
2
解决办法
57
查看次数

C++中模板类中的'const'方法

我刚刚开始阅读C++中的模板类,我遇到了一些我不知道的语法.类方法的原型如下:

template <class Type> class Range {
            ....
        bool Below    (const Type& value) const;
            ....
}
Run Code Online (Sandbox Code Playgroud)

并定义为:

template <class Type> bool Range<Type>::Below(const Type& Value) const {

    if (Value < Lo) return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

在列出方法输入后,任何人都可以帮助我理解'const'标志的含义吗?我明白在输入之前使用时有用,但之后没有.干杯,杰克

c++ templates const object

0
推荐指数
1
解决办法
155
查看次数

什么是const"at()"的目的和在这段代码中的非const at()"?

template<typename T>    
class vector {     
 vector();     
 vector(const vector& c);     
 vector(size_t num, const T& val = T());     
 ~vector();      
 T& operator[](size_t index);     
 const T& operator[](size_t index) const;     
 vector operator=(const vector& v);      
 T& at(size_t loc);     
 const T& at(size_t loc) const;      
 void pop_back();     
 void push_back(const T& val);      
 size_t size() const;     
}; 
Run Code Online (Sandbox Code Playgroud)

c++ const

0
推荐指数
1
解决办法
79
查看次数

如果首先使用非const初始化,为什么允许对const的非const引用?

可以理解,编译器将不允许以下内容:

const int ci = 1000;
int &r = ci;
Run Code Online (Sandbox Code Playgroud)

因为这意味着我可以尝试通过r来改变ci的值,但ci是const.

为什么然后允许以下内容,除了首先为r分配非const int之外,它与上面相同?

int i;
const int ci = 1000;
int &r = i;
r = ci;
Run Code Online (Sandbox Code Playgroud)

如果您尝试通过r更改ci,则ci将保持相同的值.然而,与第一个示例不同,它不会被编译器捕获.对此有解释吗?

c++ const reference

0
推荐指数
1
解决办法
82
查看次数