广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++构造函数常见的坑有哪些
  • 900
分享到

C++构造函数常见的坑有哪些

2023-06-22 07:06:03 900人浏览 安东尼
摘要

今天就跟大家聊聊有关c++构造函数常见的坑有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。某一天我们接到了一个需求,需要开发一个类似于STL中string的类。我们很快写好了代码

今天就跟大家聊聊有关c++构造函数常见的坑有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

某一天我们接到了一个需求,需要开发一个类似于STLstring的类。

我们很快写好了代码:

#include <iOStream>#ifndef STRINGBAD_H_#define STRINGBAD_H_class StringBad {    private:     char *str;     int len;     static int num_strings;    public:     StringBad(const char* s);     StringBad();     ~StringBad();     friend std::ostream & operator << (std::ostream &os, const StringBad & st);};#endif

在这个.h文件当中,我们定义了一个StringBad类,这是C++ Primer当中的一个例子。为什么叫StringBad呢,主要是为了提示,表示这是一个没有完全开发好的demo

这里有一个小细节,我们在类当中定义的是一个char *也就是字符型指针,而非字符型数组。这意味着我们在类声明当中没有为字符串本身分配空间,而是在构造函数当中使用new来完成的,避免了预先定义字符串的长度。

其次num_strings是一个静态成员,也就是说无论创建了多少对象,它都只会保存一份。类的所有成员共享同一个静态变量。

接下来我们来看一下它的实现:

#include <cstring>#include "stringbad.h"using std::cout;int StringBad::num_strings = 0;StringBad::StringBad(const char* s) {    len = std::strlen(s);    str = new char[len+1];    std::strcpy(str, s);    num_strings++;    cout << num_strings << ": \"" << str << "\" object created \n";}StringBad::StringBad() {    len = 4;    str = new char[4];    std::strcpy(str, "C++");    num_strings++;    cout << num_strings << ": \"" << str << "\" object created \n";}StringBad::~StringBad() {    cout << "\"" << str << "\" object deleted, ";    --num_strings;    cout << num_strings << " left \n";    delete []str;}std::ostream & operator<<(std::ostream & os, const StringBad &st) {    os << st.str;    return os;}

首先,我们可以注意到第一句就是将num_strings初始化成了0,我们不能在类声明中初始化静态成员变量。因为声明只是描述了如何分配内存,但并不真的分配内存。

所以对于静态类成员,我们可以在类声明之外使用单独的语句进行初始化。因为静态成员变量是单独存储的,并不是对象的一部分。

初始化要在方法文件也就是cpp文件当中,而不是头文件中。因为头文件可能会被引入多次,如果在头文件中初始化将会引起错误。当然也有一种例外,就是加上了const关键字。

从逻辑上看,我们这样实现并没有任何问题,但是当我们执行的时候,就会发现问题很多&hellip;&hellip;

假设我们现在有一个函数:

void callme(StringBad sb) { cout << "    \"" << sb << "\"\n";}

然后我们这么使用:

int main() { StringBad sb("test"); callme(sb); return 0;}

会得到一个奇怪的结果:

C++构造函数常见的坑有哪些

从屏幕可以看到我们的析构函数执行了两次,一次很好理解应该是main函数退出的时候自动执行的,还有一次呢?是什么时候执行的?

答案是执行callme函数的时候执行的,因为callme函数使用了值传递。当callme函数执行结束时,也会调用参数sb的析构函数。

如果我们改成引用传递,就一切正常了:

void callme(StringBad &sb) { cout << "    \"" << sb << "\"\n";}int main() { StringBad sb("test"); callme(sb); return 0;}

C++构造函数常见的坑有哪些

这还没完,我们把代码再改一下,会发现还有问题:

int main() { StringBad sb("test"); StringBad sports("Spinach Leaves Bowl for Dollars"); StringBad sailor = sports; StringBad knot; StringBad st = sb; return 0;}

执行一下,得到:

C++构造函数常见的坑有哪些

会发现又有负数出现了,这是为什么呢?

因为我们执行了StringBad st = sb这样的操作,这个操作并不会调用我们实现的任何一个构造函数。

它等价于:

StringBad st = StringBad(sb);

对应的构造函数原型是:

StringBad(const StringBad&);

当我们用一个对象来初始化另外一个对象的时候,编译器将会自动生成上述的构造函数。这样的构造函数叫做拷贝构造函数,由于我们没有重载拷贝构造函数,因此它不知道要对num_strings变量做处理,也就导致了不一致的发生。

看完上述内容,你们对C++构造函数常见的坑有哪些有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网其他教程频道,感谢大家的支持。

--结束END--

本文标题: C++构造函数常见的坑有哪些

本文链接: https://www.lsjlt.com/news/303391.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++构造函数常见的坑有哪些
    今天就跟大家聊聊有关C++构造函数常见的坑有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。某一天我们接到了一个需求,需要开发一个类似于STL中string的类。我们很快写好了代码...
    99+
    2023-06-22
  • C++构造函数一些常见的坑
    文章转自微信 公众号:Coder梁(ID:Coder_LT) 某一天我们接到了一个需求,需要开发一个类似于STL中string的类。 我们很快写好了代码: #include <...
    99+
    2022-11-12
  • Python构造函数有哪些
    Python中的构造函数是__init__函数Python中子类如果定义了构造函数,父类的构造函数是不会执行的。__init__函数使用方法:class A:def __init__(self, name):self.name = name...
    99+
    2022-10-11
  • Java中常见的坑有哪些
    今天小编给大家分享一下Java中常见的坑有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前言同一个代码“坑”,踩第一...
    99+
    2023-06-27
  • java构造函数的特点有哪些
    Java构造函数的特点有以下几点:1. 构造函数的名称必须与类名完全相同,且没有返回类型,包括void类型。2. 构造函数在创建对象...
    99+
    2023-08-31
    java
  • C#的分组构造有哪些
    本篇内容介绍了“C#的分组构造有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分组构造分组构造描述了正则表达式的子表达式,通常用于捕获输...
    99+
    2023-06-17
  • Java中ReentrantLock常见的坑有哪些
    这篇文章主要介绍“Java中ReentrantLock常见的坑有哪些”,在日常操作中,相信很多人在Java中ReentrantLock常见的坑有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Re...
    99+
    2023-06-30
  • matlab中常见的函数有哪些
    Matlab中常见的函数有:1. 数学函数:如sin、cos、tan、exp、log、sqrt等。2. 矩阵和向量操作函数:如tra...
    99+
    2023-09-21
    matlab
  • Mysql中有哪些常见的函数
    这篇文章将为大家详细讲解有关Mysql中有哪些常见的函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、常见函数分类1.1单行函数:字符函数字符控制函数(CONCAT、SUBSTR、LEN...
    99+
    2023-06-14
  • es6与es5的构造函数有哪些区别
    这篇文章主要介绍“es6与es5的构造函数有哪些区别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“es6与es5的构造函数有哪些区别”文章能帮助大家解决问题。 ...
    99+
    2022-10-19
  • C#有哪些常见的数据类型和控制结构
    C#具有许多常见的数据类型和控制结构。以下是其中一些常用的示例:数据类型:整数类型:int、long、short、byte等浮点数类型:float、double、decimal等字符类型:char布尔类型:bool字符串类型:string数...
    99+
    2023-10-22
    C#使用
  • C#的反向引用构造有哪些
    本文小编为大家详细介绍“C#的反向引用构造有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#的反向引用构造有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。反向引用构造反向引用允许在同一正则表达式中随后...
    99+
    2023-06-17
  • 常见Redis数据结构有哪些
    本篇内容主要讲解“常见Redis数据结构有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“常见Redis数据结构有哪些”吧!什么是数据结构?有Java基础的应...
    99+
    2022-10-19
  • PHP中构造函数的使用原则有哪些
    PHP中构造函数的使用原则有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。构造函数是PHP中总要的基本语法,什么是构造函数呢?我们这里就一起来看看PHP构造函数。如果你...
    99+
    2023-06-17
  • swing的常用构造方法有哪些
    swing的常用构造方法有:1. JFrame():创建一个新的顶层窗口。2. JFrame(String title):创建一个新...
    99+
    2023-08-26
    swing
  • mysql常见单行函数有哪些
    这篇文章将为大家详细讲解有关mysql常见单行函数有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、字符函数    concat拼接   ...
    99+
    2023-06-15
  • php中一些常见的数组函数有哪些
    小编给大家分享一下php中一些常见的数组函数有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流的数据库。4、面向对象编程:PH...
    99+
    2023-06-14
  • Javascript中有哪些常见的数据结构
    本篇文章为大家展示了Javascript中有哪些常见的数据结构,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.Stack(栈)堆栈遵循LIFO(后进先出)的原则。...
    99+
    2022-10-19
  • C#中构造线性表的类有哪些
    这篇文章将为大家详细讲解有关C#中构造线性表的类有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。让我们来看看C#数据结构与算法之构造线性表的类的代码使用:public interface&n...
    99+
    2023-06-18
  • c#常见的问题有哪些
    今天小编给大家分享一下c#常见的问题有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 ...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作