随笔分类 - 软件技术
编程语言,计算机软件相关
摘要:拷贝构造函数 拷贝构造函数的第一个参数必须是一个引用类型。虽然我们可以定义一个接受非 const 引用的拷贝构造函数,但此参数几乎总是一个 const 的引用。 拷贝构造函数在几种情况下都会被隐式地使用。因此,拷贝构造函数通常不应该是explicit的(参见 7.5.4节,第 265 页)。 一般情
阅读全文
摘要:常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。 指针和 constexpr 必须明确一点,在 constexpr 声明中如果定义了一个指针,限定符constexpr 仅对指针有效,与指针所指的对象无关: const int *p=nullptr;
阅读全文
摘要:struct Base { double x{ 111.1 }; }; struct Derive :public Base { double y{ 222.2 }; Derive& operator=(const Derive& obj) { if (&obj == this) { return
阅读全文
摘要:int i =0; int *const pl = &i; //不能改变p1的值,这是一个顶层 const const int ci=42; //不能改变 ci的值,这是一个顶层 const const int *p2 =&ci; //允许改变p2的值,这是一个底层 const const int
阅读全文
摘要:下面这种情况显然我们是了解的: const int ci=1024; const int &rl=ci; //正确:引用及其对应的对象都是常量 r1 =42; //错误:r1是对常量的引用 int &r2=ci; //错误:试图让一个非常量引用指向一个常量对象 初始化和对 const 的引用 2.3
阅读全文
摘要:如果类派生自 C++ 标准库中的类型,而你正在编译调试版本 (/MTd),并且编译器错误消息引用 _Container_base,则可以忽略 C4251。 应慎重将 __declspec(dllexport) 或 __declspec(dllimport) 添加到类中,因为这大概率会成为一种不正确的
阅读全文
摘要:/*****class Base*****/ class Base { public: Base(); virtual ~Base(); protected: struct Impl; Impl* m_Impl; }; struct Base::Impl { int num{ 100 }; }; B
阅读全文
摘要:默认状态下,const 对象仅在文件内有效。 const int bufSize=512;//输入缓冲区大小 编译器将在编译过程中把用到该变量的地方都替换成对应的值。也就是说,编译器会找到代码中所有用到 bufsize 的地方,然后用 512 替换。 某些时候有这样一种 const 变量,它的初始值
阅读全文
摘要:声明 int *ipl,*ip2; // ipl和 ip2 都是指向 int 型对象的指针 double dp,*dp2; // dp2是指向 double型对象的指针,dp是double 型对象 因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。 指针值 指针的值(即地址)应属下列4种状
阅读全文
摘要:int a{ 10 }; { cout << a << endl; int b{ 20 }; } //cout << b << endl; // 不可访问,只能从内往外查找名字。 作用域是从内往外查找的。 作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问该名字。同时,允许在内层作用域中重
阅读全文
摘要:变量声明规定了变量的类型和名字,在这一点上定义与之相同。但是除此之外,定义还申请存储空间,也可能会为变量赋一个初始值。 如果想声明一个变量而非定义它,就在变量名前添加关键字 extern,而且不要显式地初始化变量: extern int i; // 声明i而非定义i int j; // 声明并定义了
阅读全文
摘要:列表初始化 当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错: long double ld=3.1415926536; int a{ld},b={ld}; //错误:转换未执行,因为存在丢失信息的危险 int c(ld),d=
阅读全文
摘要:class Base { public: virtual ~Base() { cout << "~Base" << '\n'; } }; class Derived : public Base { public: ~Derived() { cout << "~Derived" << '\n'; }
阅读全文
摘要:一 有符号整数和无符号整数相加时,把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。 unsigned int n = 300; int m = -500; cout << m + m << '\n'; cout << n + m << '\n'; 输出: -10
阅读全文
摘要:#include <iostream> #include <type_traits> using namespace std; namespace { class IAnimal { public: virtual void say() = 0; }; class Dog : IAnimal { p
阅读全文
摘要:如果我们未定义拷贝控制成员,编译器会为我们合成;如一个类未定义构造函数,编译器会为我们合成一个默认的构造函数。 合成拷贝控制成员可能是删除的情况: 如果类中有成员的析构函数是删除的或不可访问的(private): a. 则类的合成析构函数被定义为删除的; b. 则合成拷贝构造函数被定义为删除的; c
阅读全文
摘要:#include <map> #include <vector> #include <iostream> #include <string> void FitCenterByLeastSquares(std::map<int, std::vector<double>> mapPoint, std::
阅读全文
摘要:#define _CRT_SECURE_NO_WARNINGS /*多字节转宽字节*/ int unsafe_mbstowcs() { // 设置当前的 locale 为用户环境变量指定的 locale setlocale(LC_ALL, ""); // 定义多字节字符串 const char* m
阅读全文
摘要:class Dog { public: class Animal { public: Animal(Dog* dog) { m_Dog = dog; m_Age = 1; m_Name = dog->m_Info; // 可以访问宿主类对象 } string m_Name; int getAge()
阅读全文
摘要:class Dog { public: Dog() { m_Name = "小狗狗"; m_Info = "田园狗"; m_Test = "测试"; } void showTest() { cout << "Test:" << m_Test << endl; } void showGood() {
阅读全文