我已经看到构造函数,复制构造函数,析构函数和赋值运算符保存在典型的单一类中的私有范围内.例如
class CMySingleton
{
public:
static CMySingleton& Instance()
{
static CMySingleton singleton;
return singleton;
}
private:
CMySingleton() {} // Private constructor
~CMySingleton() {}
CMySingleton(const CMySingleton&); // Prevent copy-construction
CMySingleton& operator=(const CMySingleton&); // Prevent assignment
};
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是
为什么要将析构函数和赋值运算符保留在私有范围内呢?这是强制性的吗?
公共析构函数是否会破坏单例类的任何属性?因为我们的对象构造受到限制所以不会有不必要的破坏.
我可以理解私有赋值运算符可以阻止自我赋值,但是除了额外的运行时间之外,公共赋值运算符是否还会受到伤害?
我正在练习面试问题,但我对这个基本问题很难:
这个循环执行多少次?
unsigned char half_limit = 150;
for (unsigned char i = 0; i < 2 * half_limit; ++i)
{
std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,因为unsigned int只达到255,所以它将永远执行,因为当我在255处递增unsigned char时它将恢复为0?然而,这种想法是错误的,更奇怪的是,这是输出cout给我的:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
当我尝试使用以下内容限制外观时:
if (i <= 255)
std::cout << i;
else
break;
Run Code Online (Sandbox Code Playgroud)
循环仍然是无限的.
我的问题是代码的预期结果是什么,为什么会这样?
最近 Visual Studio Studio 升级到版本 15.6.2 包括一个 Visual C++ 编译器更新,由于以下原因,该更新会导致以下代码push_back行出现警告[[nodiscard]]:
#include <vector>
struct [[nodiscard]] S
{
int i;
};
int main()
{
std::vector<S> v;
v.push_back({ 1 }); // causes warning C4834
}
Run Code Online (Sandbox Code Playgroud)
编译器是这样调用的(注意不需要指定高警告级别来重现,但这/std:c++latest是必需的,并且/permissive-是可选的):
#include <vector>
struct [[nodiscard]] S
{
int i;
};
int main()
{
std::vector<S> v;
v.push_back({ 1 }); // causes warning C4834
}
Run Code Online (Sandbox Code Playgroud)
警告来自 Visual C++ 自己的std::vector实现代码,并说:
cl /nologo /EHsc /permissive- /std:c++latest test.cpp
Run Code Online (Sandbox Code Playgroud)
(完整的警告输出见下文)
编译器版本:
warning C4834: discarding …Run Code Online (Sandbox Code Playgroud) 那里.正如标题所说.
使用#include"test.h"是合法的.
使用#include"test/test.h"也是合法的.
但使用合法#include"../test.h"吗?
例如,#pragma once几乎每个编译器都是合法的.
但这不是C++的标准.
我找不到任何说"保证"是父目录含义的文件.
谁能帮我?
所以我最近发现了地图和矢量的使用,但是,我试图想办法循环一个包含字符串的向量.
这是我尝试过的:
#include <string>
#include <vector>
#include <stdio>
using namespace std;
void main() {
vector<string> data={"Hello World!","Goodbye World!"};
for (vector<string>::iterator t=data.begin(); t!=data.end(); ++t) {
cout<<*t<<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到此错误:
cd C:\Users\Jason\Desktop\EXB\Win32
wmake -f C:\Users\Jason\Desktop\EXB\Win32\exbint.mk -h -e
wpp386 ..\Source\exbint.cpp -i="C:\WATCOM/h;C:\WATCOM/h/nt" -w4 -e25 -zq -od -d2 -6r -bt=nt -fo=.obj -mf -xs -xr
..\Source\exbint.cpp(59): Error! E157: col(21) left expression must be integral
..\Source\exbint.cpp(59): Note! N717: col(21) left operand type is 'std::ostream watcall (lvalue)'
..\Source\exbint.cpp(59): Note! N718: col(21) right operand type is 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> (lvalue)'
Error(E42): …Run Code Online (Sandbox Code Playgroud) 对不起,我有一个非常基本的问题.
这是一个非常简单的计算,一个整数(22)除以另一个整数(7).我希望c ++代码在代码内部和输出值中的实际计算中都使用精确的100位精度.使用Maple程序,我得到了
restart;
Digits:=100;
evalf(22/7);
Run Code Online (Sandbox Code Playgroud)
我得到的答案是,
3.142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857143
Run Code Online (Sandbox Code Playgroud)
但我使用以下c ++代码并得到一些不同的答案.这只是在几个实际数字之后添加零,这是完全错误的.下面是我的c ++代码.
#include <iostream>
using namespace std;
int main()
{
cout << fixed;
cout.precision(100);
cout << "22/7 = " << 22/(double)(7) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在制作一个C++程序,而我正在尝试导入所有内容#include.但我尝试的东西不起作用.我想我可能会对Python的import *功能感到困惑.
这是我的代码:
#include <*>
using namespace std;
int main()
{
cout << Hello! << endl;
return 0
}
Run Code Online (Sandbox Code Playgroud)
那么,我打开了cmd并键入:
c++ test.cpp -o test.exe
Run Code Online (Sandbox Code Playgroud)
这就是我得到的错误......
Microsoft Windows [Version 10.0.16299.309]
(c) 2017 Microsoft Corporation. All rights reserved.
C:\Users\thoma>cd Desktop
C:\Users\thoma\Desktop>c++ test.cpp -o test.exe
test.cpp:1:13: fatal error: c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\*: Invalid argument
#include <*>
^
compilation terminated.
C:\Users\thoma\Desktop>
Run Code Online (Sandbox Code Playgroud)
我的编译器是MinGW.任何帮助或答案将不胜感激.
我正在尝试使用容器来存储字符串的迭代器s,但是当我运行它时我遇到了段错误.正如您将在下面看到的那样,错误似乎随之而来char temp = **itbegin;,这可能意味着我无法通过前一个迭代器分配任何值.
为什么?我是否误用了迭代器?如何正确使用迭代器?
#include <iostream>
#include <vector>
using namespace std;
string reverseVowels(string s);
int main()
{
string s ="hello";
cout << reverseVowels(s);
}
string reverseVowels(string s) {
string::iterator iter = s.begin();
string::iterator iterend = s.end();
vector<string::iterator> iteratorbox;
for(;iter != iterend ; ++iter){
if((*iter) == 'a' &&
(*iter) == 'e' &&
(*iter) == 'i' &&
(*iter) == 'o' &&
(*iter) == 'u'){
iteratorbox.push_back(iter);
}
}
auto itbegin = iteratorbox.begin();
auto itend = iteratorbox.end() ;
--itend; …Run Code Online (Sandbox Code Playgroud) 我尝试使用下面的代码片段并得到如下所述的编译错误
代码片段:
#include <iostream>
using namespace std;
template <class TYPE1>
struct SDataContainer
{
SDataContainer(TYPE1 pData)
{
m_pData = pData;
}
bool operator==(const SDataContainer<TYPE1>& pData)
{
return (m_pData == pData.m_pData);
}
TYPE1 m_pData;
};
template <class DATATYPE1>
class Comparison
{
public:
Comparison (const SDataContainer<DATATYPE1>& pSData)
{
m_SData = pSData;
}
bool operator==(const Comparison<DATATYPE1>& pData)
{
return (m_SData.m_pData == pData.m_SData.m_pData);
}
SDataContainer<DATATYPE1> m_SData;
};
int main()
{
SDataContainer<float> sDCObj1 (10.0);
SDataContainer<float> sDCObj2 (10.0);
cout << "Verify the data: " << (sDCObj1 == …Run Code Online (Sandbox Code Playgroud) 我正在从计算机系统程序员的角度研究2.1节,我理解代码在做什么,但我不明白为什么围绕形式参数"byte_pointer"后跟&x有括号?
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len) {
int i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]);
printf("\n");
}
void show_float(float x) {
show_bytes((byte_pointer) &x, sizeof(float));
}
void show_int(int x) {
show_bytes((byte_pointer) &x, sizeof(int));
}
void show_pointer(void *x) {
show_bytes((byte_pointer) &x, sizeof(void *));
}
Run Code Online (Sandbox Code Playgroud) c++ ×9
c ×1
c++11 ×1
c++17 ×1
containers ×1
function ×1
include ×1
include-path ×1
parameters ×1
singleton ×1
stl ×1
templates ×1
vector ×1
visual-c++ ×1
watcom ×1