首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在使用[]时,C++映射类型参数需要一个空的构造函数?

为什么在使用[]时,C++映射类型参数需要一个空的构造函数?
EN

Stack Overflow用户
提问于 2009-03-29 23:49:59
回答 5查看 40.4K关注 0票数 110

另请参阅

C++ standard list and default-constructible types

这不是一个大问题,只是很烦人,因为我不希望我的类在没有特定参数的情况下被实例化。

代码语言:javascript
运行
AI代码解释
复制
#include <map>

struct MyClass
{
    MyClass(int t);
};

int main() {
    std::map<int, MyClass> myMap;
    myMap[14] = MyClass(42);
}

这给出了以下g++错误:

/usr/include/c++/4.3/bits/stl_map.h:419:错误:没有匹配的函数调用‘MyClass()’

如果我添加了一个默认的构造函数,它就可以很好地编译;我确信这不是由不正确的语法引起的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-29 16:01:41

此问题随operator[]一起出现。引用自SGI文档:

data_type& operator[](const key_type& k) -返回与特定键关联的对象的引用。如果贴图尚未包含此类对象,operator[]将插入默认对象data_type()

如果你没有默认的构造函数,你可以使用插入/查找函数。下面的示例运行良好:

代码语言:javascript
运行
AI代码解释
复制
myMap.insert( std::map< int, MyClass >::value_type ( 1, MyClass(1) ) );
myMap.find( 1 )->second;
票数 182
EN

Stack Overflow用户

发布于 2009-03-30 00:53:47

检查stl::map存储类型的要求。许多stl集合要求存储类型包含一些特定属性(默认构造函数、复制构造函数等)。

不带参数的构造函数是stl::map所需要的,因为在使用键调用operator[]时会使用它,而键还没有被映射保留。在本例中,operator[]插入由使用无参数构造函数构造的新键和值组成的新条目。然后返回这个新值。

票数 5
EN

Stack Overflow用户

发布于 2021-12-22 11:15:33

假设您拥有以下内容

代码语言:javascript
运行
AI代码解释
复制
class Person
{
public:
    Person(int age) :age(age){}
    Person() {} // default ctor
    int age;
};

map<int, Person> m;

// accessing not-existent key, results in assigning default value to that key
m[10];

// creates default object for key:20 first then assigns age
m[20].age = 32;

如果你想为一个不存在的键分配age,该怎么办呢?

对于具有null类型的语言,例如javascript,映射将返回null,并由用户在访问对象或其内部字段之前对其进行检查。

c++采用了一种不同的方法,它使用默认构造函数创建Person,这样就可以完全避免null

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/695645

复制
相关文章
C++带参数的构造函数 | 有参构造函数
在C++中,程序员希望对不同的对象赋予不同的初值,可以采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数, 以实现不同的初始化。
小林C语言
2021/01/28
4.1K0
C++带参数的构造函数 | 有参构造函数
C++转换构造函数与类型转换构造函数
转换构造函数:  转换构造函数的只有一个形参: 1 Student(float s) 2 { 3 score = s; 4 age = 0; 5 }  如果已经在上面定义了构造函数: 1 Student(85); //建立对象c1,由于只有一个参数,调用转换构造函数 如果对“+”进行了重载,那么以下是编译错误的: 1 stu2 = stu1 + 85; //这样编译错误 2 stu2 = stu1 + Student(85); //合法,将85转换为
233333
2018/03/07
1.9K0
C++构造函数 | 构造函数
C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它的值是不可预知的,因为在系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值,在C++中,对象是一个实体,它反映了客观事物的属性,是应该有确定的值的。
小林C语言
2021/01/26
2.2K0
C++构造函数 | 构造函数
java scanner构造函数_使用Scanner作为构造函数的参数的Java
这是一个学校任务的问题,这就是为什么我这样做的原因。使用Scanner作为构造函数的参数的Java
用户7886150
2021/04/26
2.9K0
【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )
1 . 讨论问题 : 本章只针对一点进行讨论 , 那就是对两种类型的参数修改 , 是否影响到外部的变量 ; 传入什么样的参数才能修改外部变量 , 即 参数当返回值使用 ;
韩曙亮
2023/03/27
2.2K0
C++构造函数的作用_c++什么是构造函数
就是构造函数的作用可以这样理解,如果没有构造函数就是类里边只是声明了成员变量,成员函数,还有最后的对象,这样你在对该对象进行初始化赋值时就比较麻烦就得先调用成员函数对成员变量赋值,成员变量进而作用到对象上,之后有了构造函数,在构建构造函数时直接可以带参数对对象进行初始化,相当于省略了步骤,可以这样简单的理解。
全栈程序员站长
2022/10/29
1.5K0
C++的构造函数
很多时候我们希望在创建一个类对象的同时能够给它的数据成员赋初值,因为类的数据成员是不能在声明的时候赋初值的,所以一种方法是可以通过定义成员函数来给数据成员赋初值,但有时候我们可能会忘记去调用这个函数,因此能不能建立一种机制,让系统自动调用赋初值的函数呢?
叶茂林
2023/07/30
1810
小朋友学C++(9):构造函数的默认参数
构造函数可以预先赋一个初值,其作用是:在构造函数被调用时,省略部分或全部参数,这时就会使用默认参数代替实参。 程序: #include <iostream> using namespace std; class Rectangle { private: int width; int height; public: Rectangle(int w = 0, int h = 0) { cout << "Constructor method is invoked!
海天一树
2018/04/17
1.1K0
C++ 构造函数的运用,继承、派生时的重载方式
c++在进行实例化的时候通常需要使用构造函数,没有显示构造函数的时候,系统会默认一个所有参数为空的默认构造函数。
雪碧君
2023/02/15
7340
C++ 中为什么需要虚函数
我最近正在学习 C++ 的虚函数,我知道虚函数是用于子类继承的,但虚函数什么时候才需要用它?因为我发现有的教科书上有用 virtual,有的又不用,我有点搞混了。
ClearSeve
2022/02/10
8860
【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )
无参构造函数 : 只负责为指针类型的成员变量分配内存 , 并赋值一个初始值 , 没有具体的赋值信息 , 该初始化只能为 成员变量 赋值一个默认值 ;
韩曙亮
2023/10/15
5120
【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )
C++的移动构造函数
C++的移动构造函数是一种特殊的构造函数,用于将资源从一个对象转移到另一个对象而不进行深拷贝。移动构造函数通常用于支持移动语义,以提高代码的效率和性能。
叶茂林
2023/07/30
7440
Aop动态生成代理类时支持带参数构造函数
  在某些情况下,我们需要植入AOP代码的类并没有默认构造函数。那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数。自己折腾了1晚上没搞定,现在搞定了发出来供大家一起学习探讨。
Zachary_ZF
2018/09/10
1.2K0
Aop动态生成代理类时支持带参数构造函数
C++ explicit禁止单参数构造函数隐式调用
C++中单参数构造函数是可以被隐式调用的,主要有两种情形会隐式调用单参数构造函数: (1)同类型对象的拷贝构造;即用相同类型的其它对象来初始化当前对象。 (2)不同类型对象的隐式转换。即其它类型对象隐式调用单参数拷贝构造函数初始化当前对象。比如A a=1;就是隐式转换,而不是显示调用构造函数,即A a(1);。像A(1)这种涉及类型转换的单参数构造函数,又被称为转换构造函数(Converting Constructor)。
恋喵大鲤鱼
2018/09/27
4.8K1
mybatis文件映射之当输入的参数不只一个时
2、多个参数:mybatis遇见多个参数会进行特殊处理,多个参数会被封装成员一个map,#{}就是从Map中获取指定的key的值。
西西嘛呦
2020/08/26
4780
C++拷贝构造函数
     拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。 调用拷贝构造函数的情形 在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”): 1) 一个对象作为函数参数,以值传递的方式传入函数体; 2) 一个对象作为函数返回值
猿人谷
2018/01/17
2K0
C++拷贝构造函数
c++拷贝构造函数
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:
全栈程序员站长
2021/09/30
1.1K0
c++拷贝构造函数
C++拷贝构造函数
假定有类T 则下列情况调用的函数是不一样的: T a = b; a=b; 第一种情况调用的是拷贝构造函数 第二种情况调用的是赋值运算符。 默认的拷贝构造函数执行的是浅拷贝,在对象涉及到动态分配的存储空间时,会出现问题。 在a中修改变量值后,b中的也发生改变。 出现内存泄漏(只new但是没有delete就会出现这样的问题) 一个地址被多次释放也会出错 要解决上面的问题,就要执行深拷贝 深拷贝使得每一个对象成员都有自己的内存空间。 要执行深拷贝,那么就要自己定义拷贝构造函数。 主要操作在于,对于动态分配的空间,
灯珑LoGin
2022/10/31
6000
C++构造函数语义(合成默认构造函数)
       在初学C++的时候,对于一个对象来说,如果我们没有去定义其默认构造函数,那么编译器就会为我们自动生成一个默认构造函数。但其实是不准确的,具体来说是编译器会在必要的时候来生成一个默认构造函数,那么这个编译器生成的默认构造函数称为合成默认构造函数。那么在以下四种情况中编译器才会生成一个合成默认构造函数:
Ch_Zaqdt
2020/03/09
1.4K0
点击加载更多

相似问题

为什么需要空构造函数?

21

为什么在映射中存储时需要默认构造函数?

40

C++:没有调用的匹配函数:为什么需要空构造函数?

14

为什么在使用构造函数时需要赋值为空值?Java

10

为什么C++构造函数在继承中需要默认参数?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文