我对最佳实践感到好奇.让我们假设我需要构造一个不应该被修改的对象:
void fn() {
const std::string& ref_to_const = "one";
...
const std::string const_object = "two";
...
}
Run Code Online (Sandbox Code Playgroud)
临时对象和const对象的生命周期都是相同的.那么使用什么方法?
所以我在javascript和HTML5 Canvas中构建了一个圆形随机颜色选择器实用程序,所有组件都是动态的,对象的大小调整为屏幕大小,间距也根据屏幕大小调整.此外,如果用户调整显示大小,该实用程序也会动态调整大小.
我正在使用数组来存储圆圈的颜色.生成圆圈时,它们使用数组中的第一种颜色,从数组中删除该颜色,然后随机播放该数组.
问题是当用户调整显示器大小时,颜色数组没有足够的颜色来绘制所有圆圈,这是因为代码删除了使用的颜色,因此没有重复.但是,我尝试通过声明一个名为origColours的常量颜色数组并将colors数组设置为等于origColours数组来解决此问题.
以下是我编写的代码.我看不出origColours数组是如何或为什么被操纵的,希望你能提供帮助
:)
//########//SETUP
var canvas = document.getElementById("myCanvas");
var c = canvas.getContext("2d");
canvas.height = innerHeight;
canvas.width = innerWidth;
document.documentElement.style.overflow = 'hidden'; // firefox, chrome
document.body.scroll = "no"; // ie only
//########//COLORS
const origColours = ["#1c2133", "#2b6ea8", "#5d99bf", "#333968", "#000000", "#b000b0", "#0000aa", "#ff0000", "#00aaaa", "#7CFC00", "#00FF7F", "#8B0000", "#F0E68C"];
var colours = ["#1c2133", "#2b6ea8", "#5d99bf", "#333968", "#000000", "#b000b0", "#0000aa", "#ff0000", "#00aaaa", "#7CFC00", "#00FF7F", "#8B0000", "#F0E68C"];
//########//VARIABLES
var backgroundColour = 0;
var mouse = {
x: …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习C++,而我正在创建一些无用的应用程序来测试.我正在使用const char和参数,在这段代码中我无法获得标题字符串.
const char* title = "";
if (argc >= 3) {
string tittle(argv[2]);
title = tittle.c_str();
}
Run Code Online (Sandbox Code Playgroud)
请帮我!
我有一个函数 getElement返回一个指向地图值的指针.
int * getElement(const int &key) const {
return (int*)&m.find(key)->second;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用return &m.find(key)->second它,例如它会创建一个编译错误:
在成员函数'int*A :: getElement(const int&)const'中:12:30:错误:从'const int*'到'int*'的无效转换[-fpermissive]
&m.find(key)->second才能(int*)&m.find(key)->second正确编译代码?#include <iostream>
#include <string>
#include <map>
class A {
public:
void addElement(const int &key, const int &value) {
m.emplace(key,value);
}
int * getElement(const int &key) const {
return (int*)&m.find(key)->second;
}
private:
std::map<int,int> m;
};
int main()
{
A a;
int value = 1;
int key = 1;
a.addElement(key,value);
int * x = a.getElement(1); …Run Code Online (Sandbox Code Playgroud) 如果“ const”关键字所引用的对象不是const对象,则引用的目的是什么?r1和r2(下)之间有什么区别?
int i = 42; // non const object
const int &r1 = i; // const reference to non const object
int j = 25; // non const object
int &r2 = j; // non const reference to non const object
Run Code Online (Sandbox Code Playgroud)
这是CPP Primer 5th的报价:
“ C ++程序员倾向于将短语“对const的引用”缩写为“ const引用”。这种缩写是有道理的-如果您还记得它是一个缩写。从技术上讲,没有const引用。引用不是对象,因此。我们不能将引用本身设为const。确实,因为没有办法使引用引用到另一个对象,所以在某种意义上,所有引用都是const。引用是引用const类型还是非const类型都会影响我们可以做的事情。参考,而不是我们是否可以更改参考本身的绑定。”
我认为这意味着在引用非const对象时将其引用为“ const”绝对没有任何作用。定义引用时,我们也可以删除const关键字。
在这里询问此问题以进行确认。
编辑:看起来我最初的猜想是错误的。我现在了解,对非const对象的const引用确实有一个目的:防止引用修改该对象。非const对象仍然可以通过其他方式修改,但不能通过此const引用进行修改。
谢谢大家
我是C++编程的新手,在我的OPP课程中,我们被要求创建一个电话簿.
现在,教授在讲座中说了一些关于如果你想确保注入方法的变量没有被改变的话,你必须把const放在它上面.
到目前为止,这是我的代码.
private:
static int phoneCount;
char* name;
char* family;
int phone;
Phone* nextPhone;
public:
int compare(const Phone&other) const;
const char* getFamily();
const char* getName();
Run Code Online (Sandbox Code Playgroud)
在Phone.cpp中
int Phone::compare(const Phone & other) const
{
int result = 0;
result = strcmp(this->family, other.getFamily());
if (result == 0) {
result = strcmp(this->name, other.getName);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在比较函数中调用strcmp时,我不断得到"对象具有与成员不兼容的类型限定符".我知道我可以删除函数声明中的const,它会消失,但我仍然不明白为什么它首先显示出来.
非常感谢帮助.
这是我们在C++类简介中给出的另一个"重新发明轮子"的问题:
编写一个函数,返回字符串中第一次出现的字符序列的位置,即
strstr函数的变体.
我开始编写如下函数:
int strstr2(const char *text, const char *pattern) {
int pos = 0;
char *temp;
temp = text;
}
Run Code Online (Sandbox Code Playgroud)
我以为我会记住字符串的第一个字符的地址以供将来在函数中使用,但编译器说:
"const char*"类型的值不能分配给"char*"类型的实体.
我知道一旦初始化了一个常量就不能改变它,但是为什么我不能将指向常量char的指针分配给另一个非常量指针?
我读了几个关于指针和常量的问题,看来这篇文章的接受答案的底部可能会回答我的问题,但我不是百分百肯定,因为讨论对我来说仍然处于过于先进的水平.
我的第二个问题是,解决方法是什么?如何定义指向字符串开头的指针?
谢谢.
鉴于以下C++代码:
#include <iostream>
int main()
{
const int i = 1;
*const_cast<int*>(&i) = 1; // Not allowed but doesn't do anything?
std::cout << i << "\n";
}
Run Code Online (Sandbox Code Playgroud)
问题:上面的代码是否调用UB(未定义的行为)?我知道抛弃const并为iUB中的结果赋值,因为我们不允许更改const变量的值.但是,在上面的代码中,我实际上没有更改 - 的值i- 那么,这仍然是UB吗?
举个例子:
int main()
{
const char* what = "Is This";
what = "Interesting";
cout << *what;
what[3] = 'a'; // Sytax Error: expression must be a modifiable lvalue
cout << *what;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因此,我声明what为const char*,并能够为其重新分配另一个值(内存中的实际数据-而不是内存地址本身)。
但是,这告诉我,我不能更改第4位的角色!
这是为什么?
我正在学习,但是在为字符的统计页面编写这些getter时,我得到一个错误,它是非标准的,它不能转换const,并且告诉我添加一个&“以创建指向成员的指针”
我试过用*来使它们成为指针,我试过不使它们成为const,而是使其成为公共对象,并添加我所缺少的任何标头。
这些是许多出现错误的唯一行。它产生大约30个错误。
inline const double& getX() const { return this->getX; }
inline const double& getY() const { return this->getY; }
inline const std::string& getName() const { return this->name; }
inline const int& getLevel() const { return this->level; }
inline const int& GetExpNext() const { return this->expNext; }
inline const int& getHP() const { return this->hp; }
inline const int& getStamina() const { return this->stamina; }
inline const int& getDamageMin() const { return this->getDamageMin; }
inline const int& getDamageMax() const …Run Code Online (Sandbox Code Playgroud) const ×10
c++ ×9
arrays ×2
pointers ×2
reference ×2
char ×1
dictionary ×1
getter ×1
if-statement ×1
javascript ×1
strcmp ×1
string ×1