C++开发:知识缺漏学习及ERROR集锦

本文详细探讨了C++编程中常见的错误及其解决方案,包括内存释放问题、错误使用非静态成员、常量成员函数的传递问题、未定义引用等。此外,还介绍了override和final的关键字理解、虚函数和抽象类的概念、虚析构函数的作用以及代码规范如using namespace、头文件声明顺序等。通过对这些知识点的深入讲解,帮助开发者提升C++编程技能。
摘要由CSDN通过智能技术生成

1.内存释放问题

部分容器clear之后,其capacity还是不变的,并没有释放空间。这时候就需要用swap的trick或者C++11的shrink_to_fit来释放空间。具体需要释放空间的容器和注意的问题如下:
1)只有含 reserve()/capacity() 成员函数的容器才需要用swap的trick来释放空间,而 C++ 里只有 vector 和 string 这两个符合条件。在 C++11 中可以直接使用 shrink_to_fit(),这个比swap好,简单说就是更智能了,会考虑当前状态下容器的空间和目标所需空间来决定是否释放空间。
2)list/deque/set/map 等容器是没有 reserve() 和 capacity() 这两个成员函数的,因此 swap 是无用功(除非用户代码使用了定制的 per-object allocator)。

2.error: invalid use of non-static data member ’XXX’

翻译过来的意思非法访问了类里的某些成员变量。最后发现是作用域的问题。
例如我在Test.h中声明了函数:

std::unique_ptr<std::unordered_map<std::string,std::string>>& getMember();

在Test.cpp里实现该函数:

std::unique_ptr<std::unordered_map<std::string,std::string>>& getMember() {
   
    return Test::ptr_of_Test;  //报错 invalid use of non-static...
}

因为,编译器并不知道这个getMember是Test.h的,而且Test作用域里的ptr_of_Test又不是静态成员,所以报错。所以实现Test.h的函数时要声明函数作用域,正确如下:

std::unique_ptr<std::unordered_map<std::string,std::string>>& Test::getMember() {
    //加上Test::
    return Test::ptr_of_Test; //return ptr_of_Test;也可以,因为当前作用域已经指定
}

3.error: passing ‘const xxx’ as ‘this’ argument of xxx discards qualifiers [-fpermissive]|

例如以下代码:

#include <bits/stdc++.h>
using namespace std;
class Test {
   
public:
    Test () {
   }
    map<int,int>& getmap() {
   
        return Hash;
    }
    map<int,int>Hash;
};
void output(const Test& t){
   
    auto& curHash = t.getmap(); //报错
    cout << curHash.size() << endl;
}
int main() {
   
    Test test;
    output(test);
}

出现该问题的原因是因为我ouput的参数是一个const常量,尽管我t.getmap()得到的map我是只读,但编译器不知道。因此解决办法有3种:
1)将getmap函数申明为常量

#include <bits/stdc++.h>
using namespace std;
class Test {
   
public:
    Test () {
   }
    map<int,int> getmap() const {
    //将函数申明为常量
        return Hash;
    }
    map<int,int>Hash;
};
void output(const Test& t){
   
    map<int, int> curHash = t.getmap(); //但就实现不了变量引用
    cout << curHash.size() << endl;
}
int main() {
   
    Test test;
    output(test);
}

2)不 要使用const参数或const_cast强制转换
使用非const参数是最方便的,但是我们又怕代码不小心改动了此参数,声明为const比较安全,且理论上效率更高。

#include <bits/stdc++.h>
using namespace std;
class Test {
   
public:
    Test () {
   }
    map<int,int>& getmap() {
   
        return Hash;
    }
    map<int,int>Hash;
};
void output(Test& t){
     //使用非const参数
    auto& curHash =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值