首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 )

一、在不同的内存中创建类的实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...栈内存中的 变量 Student s1 ; 这些都是在 栈内存 中创建 类的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存中的实例对象销毁 ; 栈内存中 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ; 2、堆内存中创建实例对象 在 栈内存 中声明 类 的 实例对象 方式是 : 该 s1...实例对象存放在栈内存中 , 会占用很大块的栈内存空间 ; Student s1; 在 堆内存 中声明 类 的 实例对象 方式是 : 该 s2 实例对象是存放在堆内存中的 , 栈内存中只占 4 字节的指针变量大小...; Student* s2; 在 C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码中 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数

18920

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 类的 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加的参数是 对象本身的指针 ; 在 Student 类中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身的成员 ; 在全局函数中 , 实现两个 Student 类相加 , 接收两个...Student 引用类型的参数 , 引用相当于一级指针 ; // 全局函数中 , 将两个 Student 对象相加 // 引用的 等同于 一级指针 , Student 引用用法与 Student 对象用法相同..., 将 两个 Student 对象相加 , 返回的是一个匿名对象 , 该匿名对象 是在 成员函数 中新创建的对象 ; // 成员函数中, 将两个 Student 对象相加 // 全局函数 转为 成员函数

23820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++实现一个简单的String类

    C++实现一个简单的String类 使用基本的C++知识实现一个简单的String类,这个类中包含了C++常用的知识点。感觉是很有意思的一个小代码片段。...类声明 该类中包含了三个构造函数:有参数的构造函数,拷贝构造函数已经移动构造函数 重载了[],=(一个普通赋值运算符,一个移动赋值运算符),+,==四个运算符 一个用于求字符长度的方法;一个用于获取...(" << *this << ")\n"; } String::String(const String& other) { // 在类的成员函数中可以访问同类型实例的私有变量 init..._buffer); } } /* * 关于是返回对象本身还是返回对象引用 * 如果函数返回在函数中创建的临时对象,则不要使用引用 * 如果函数返回的是通过引用或指针传递给它的对象,则应当按引用返回对象...析构函数(Word) 析构函数(Hello) 主程序中的第7行和第11行各自调用一次默认的有参构造函数,第14行是重载的加法运算符中调用了一次无参的构造函数(由于C++编译器的优化,函数返回值没有调用拷贝构造函数

    1.6K10

    C++:32---IO库

    例如,wcin、wcout、wcerr是分别对应cin、cout、cerr的宽字符版对象 宽字符版本的类型和对象与其对应的普通char版本的类型定义在同一头文件中。...利用模板,我们可以使用具有继承关系的类,而不必了解继承机制如何工作的细节 例如: 类型ifstream和istringstream都继承自istream:因此我们可以像使用istream对象一样来使用ifstream...IO对象,因此我们也不能将形参或返回值类型设置为流类型 进行IO操作的函数通常以引用方式传递和返回流 读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的 三、条件状态 IO操作使用时也会发生错误...ifile为一个文件名ofstream out; //输出文件流,未关联到任何文件 在C++新标准之前,文件名只允许C风格的字符数组;C++新标准之后,文件名既可以是string对象,也可以是...&read(istream &is, Sales_data &item){double price = 0; //单价//从istream对象中读取数据,将读取的内容输入到item对象中is >> item.bookNo

    57230

    C++抛出异常与传递参数的区别

    抛出异常与传递参数的区别 从语法上看,C++的异常处理机制中,在catch子句中申明参数与在函数里声明参数几乎没有什么差别。例如,定义了一个名为stuff的类,那么可以有如下的函数申明。...相同点就是传递参数和传递异常都可以是传值、传引用或传指针。 (1)区别一:C++标准要求被作为异常抛出的对象必须被拷贝复制。考察如下程序。...在随后的抛出异常的操作中,尽管catch子句捕捉的是异常对象的引用,但是捕捉到的异常对象已经不是localStuff,而是它的一个拷贝。...C++规定对被抛出的任何类型的异常对象都要进行强制复制拷贝, 为什么这么做,我目前还不明白。 (2)区别二:因为异常对象被抛出时需要拷贝,所以抛出异常运行速度一般会比参数传递要慢。...在catch中捕获的是异常对象的引用,所以拷贝构造函数构造的Stuff对象与在catch块中使用的对象w是同一个对象,因为他们具有相同的地址0x0022F738。

    1.6K20

    C++笔记:运算符重载

    C++笔记:运算符重载 引言 函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,做到“一名多用”。 运算符也可以重载,在C++标准库中也使用了大量的运算符重载。...+ 能实现int、float、double类型的不同的运算。同样的,可对“+”运算符进行重载,实现两个对象的加法运算。...重载运算符的规则 C++ 不允许用户自己定义新的运算符,只能对已有的 C++ 运算符进行重载。 C++ 中绝大部分的运算符允许重载。...: 条件运算符 运算符重载不能改变运算符的运算对象(即操作数)的个数、优先级和结合性。 重载的运算符必须和用户自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。...其中,cin 和 cout 分别是输入流类 istream 和输出流类 ostream 的对象。

    1.4K20

    类和对象(万字总结!深度总结了类的相关知识)(中)

    命名:构造函数的名字与类名相同(在C++中),没有返回类型(即使是void也没有)。 重载:构造函数可以被重载,即可以定义多个构造函数,参数列表不同以实现不同的初始化方法。...默认构造函数:如果不显式定义构造函数,编译器会提供一个默认的无参构造函数。 初始化列表:在C++中,构造函数可以通过初始化列表直接初始化成员,效率更高。...4.2 拷贝构造函数的定义 在C++中,拷贝构造函数的定义通常如下: class A { public: A(const A& other); // 拷贝构造函数 }; 参数:它接受一个自身类型对象的引用作为参数...运算符重载使得自定义类可以使用与内置类型相同的运算符进行操作,提高了代码的可读性和一致性。 在C++中,赋值运算符的重载允许你定义如何将一个对象的值赋给另一个对象。...: (条件运算符) sizeof(字符长度运算符) 6.const成员函数 6.1 const关键字 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。

    9810

    C++抛出异常与传递参数的区别

    抛出异常与传递参数的区别 从语法上看,C++的异常处理机制中,在catch子句中申明参数与在函数里声明参数几乎没有什么差别。例如,定义了一个名为stuff的类,那么可以有如下的函数申明。...相同点就是传递参数和传递异常都可以是传值、传引用或传指针。 下面考察二者的不同点。 (1)区别一:C++标准要求被作为异常抛出的对象必须被拷贝复制。 考察如下程序。...在随后的抛出异常的操作中,尽管catch子句捕捉的是异常对象的引用,但是捕捉到的异常对象已经不是localStuff,而是它的一个拷贝。...C++规定对被抛出的任何类型的异常对象都要进行强制复制拷贝, 为什么这么做,我目前还不明白。 (2)区别二:因为异常对象被抛出时需要拷贝,所以抛出异常运行速度一般会比参数传递要慢。...在catch中捕获的是异常对象的引用,所以拷贝构造函数构造的Stuff对象与在catch块中使用的对象w是同一个对象,因为他们具有相同的地址0x0022F738。

    1.8K30

    getline函数(精华版)

    另外要注意,C++中有两个getline函数,一个是在string头文件中,定义的是一个全局的 函数,函数声明是istream& getline ( istream& is, string& str,...cout<<a; } 输出结果是a 其实istream的getline是在全局函数的getline函数的基础上,又多了一个终止读取的条 件,即根据已读取的字符的个数来判定,实际上是读取n-1个字符,因为最后要为...这句从 语法上看,是    sentry是一个class, _Ok是sentry类的一个const对象,构造这个对象时需要传入两个 参数    第一个是流对象自身的引用,第二个表示对空白字符(如空格、制表符...sentry类的构造函数    * 在初始化时设置,设置的过程比较麻烦,这里不做赘述(其实我也没看十分明白)。   ...由于是传引用,所以不论调用哪个,都会改变原文件流中get的指针所指向的位置。

    1.6K40

    【C++ 程序设计入门基础】- Chapter One

    不同于C语言,C++是一种面向对象的语言,在 C 语言的基础上,C++ 扩充了一些自己特有的知识,如 bool 类型、重载函数、模板、STL等。...C++ 在进行输入时需要从流中提取数据,在输出时需要向流中插入数据,提取和插入是通过在流类库中重载 “>>” 和 “的。...(CP_UTF8); /2、除了单个变量读取,cin对象也可以一次读入多个变量的值,因为“>>”运算符返回的是 istream 的引用,可连续提取数据。...除了在输入的数据之间加空格,也可以在每输入一个数据后按回车键,这样完全可以正确的读入数据。 3、采用cin对象也可以对不同类型的变量读入数据。...4、cout对象可以连续输出数据 int a = 10; char c = 'a'; cout << a << "," << c << endl; 当用户在程序中包含了头文件iostream时,编译器调用相应的构造函数产生这

    1K20

    《挑战30天C++入门极限》C++的iostream标准库介绍(1)

    库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。...在上例中我们之所以用printf与cout进行对比目的是为了告诉大家,C与C++处理输入输出的根本不同,我们从c远的输入输出可以很明显看出是函数调用方式,而c++的则是对象模式,cout和cin是ostream...类和istream类的对象。   ...C++风格的字符串类型string,在循环读取的时候逐一保存到content中,要使用string类型,必须包含string.h的头文件。   ...我们先看看看C++是如何对C风格的字符串流进行控制的,C中的字符串其实也就是字符数组,字符数组内的数据在内存中的位置的排列是连续的,我们通常用char str[size]或者char *str的方式声明创建

    94710

    IO库

    c++ 语言中不直接处理输入和输出,而是通过一族定义在标准库中的类型来处理IO,这些类型支持从设备读取数据、向设备写入数据的IO操作。设备可以是文件、控制台窗口等。...还有一些IO运行内存IO,即可以从string中读写数据。 IO库 IO类 最开始接触的c++ 中的io是我们从控制台接受输入的istream和输出到控制台中的ostream。...、因此在函数中无法返回IO类型也无法传递IO类型,只能使用IO类型的引用 读写一个IO对象会改变其状态,所以在函数中传递和返回IO的对象不能是const的 一个流如果发生错误,其上后续的IO操作都会失败...因此代码通常应该在使用一个流之前检查它是否处于良好状态,确定一个流对象的状态最简单的方式是将它作为一个条件来使用。 作为条件使用只能告诉我们流是否有效,而无法告诉我们具体发生了什么。...也可以在fstream对象被销毁时由它的构造函数自动调用close 每个流都有一个关联的文件模式,用来指出该如何使用文件 in: 以读的方式打开 out: 以写的方式打开 app: 每次写操作前均定位到文件尾部

    86330

    【C++之STL】一文学会使用 string

    在通过了标准化第一个草案之后,联合标准化委员会又投票并通过了将STL包含到C++标准中的提议。STL对C++的扩展超出C++的最初定义范围。...根据字符串 s 的前 n 位构造出一个 string 实例化对象。...不能直接访问对象中的 _size 和_capacity,一方面是因为这是私有成员变量;另一方面,就算声明了友元函数,C++标准中并没有规定_size和_capacity的具体名称,因此不同编译器中的这两个变量的名称可能不同...正式因为end()指向的最后一个元素的下一个位置,也就是说end()的返回值的解引用没有意义,所以在使用迭代器区间进行构造/赋值时,都是左闭右开的。...如果不加&引用符号,范围 for 在遍历时会把容器中的元素直接复制给迭代变量,迭代变量不是迭代器!

    19710

    C++基础知识一

    :包装了std的C++头文件,对应的是新的strng类。 main:操作系统通过调用main函数来运行C++程序,返回类型必须为int,即整数类型。...clog用来输出程序运行时的一般性信息。 的运算对象必须是一个ostream对象,右测是要打印的值。 endl:被称为操纵符。...函数名:函数为人所知的名字,也用来进行函数调用。 头文件:使类或其他名字的定义可被多个程序使用的一种机制,通过#include指令使用头文件。 if语句:根据特定条件进行条件执行的语句。...命名空间:将库定义的名字放在一个单一位置的机制,命名空间可以避免名字冲突,C++标准库定义的名字在命名空间std中。 ::域运算符:用处之一就是访问命名空间中的名字。...const的引用,与普通引用不同的是,对常量引用不能被用作修改他所绑定的对象,引用及其对应的对象都是常量。 const的引用简称为常量引用。

    81300

    谈对象第二弹: C++类和对象(中)

    三、析构函数 析构函数完成与构造函数的功能相反,析构函数本身不需要对对象进行销毁,在结束一个局部函数的调用后,C++规定对象在销毁时会自动调用它对应的析构函数完成资源清理,而函数存在栈帧,函数结束后栈帧销毁...一个局部域有多个对象,C++规定后定义的先析构 int main() { Date d1; Stack st; return 0; } 这里定义了两个对象d1和st,根据编译器的运行结果不难印证后定义的先析构的规定...多个对象也不仅指不同类型之间的对象,同种类型之间的对象也会出现这种情况。 、 一个类只有一个析构函数。若没有显示定义,系统会自动生成默认的析构函数。...0; } 根据前面实现的Date类,编译以上代码,编译器会报错:warning C4172: 返回局部变量或临时变量的地址: d,不让你运行下去。...传引用返回一定要保证,函数被销毁后这个返回对象还存在。 五、运算符重载 5.1运算符重载 当运算符被用于类类型的对象是,C++语言允许通过运算符重载的形式指定新的含义。

    6500

    C++ 类和对象

    类可以认为是一种复制用的设计图,可以根据它实例出很多对象,从而占据实际物理空间。...C++给定实例化对象也要符合内存对齐规则。 对齐规则 第一个成员在结构体偏移量为0的位置。...,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是一种特殊的构造函数 拷贝构造函数是构造函数的一种重载 拷贝构造函数的第一个参数必须是类类型对象的引用...传值返回会产生一个临时对象调用拷贝构造,传值引用返回,返回的是返回对象的别名(引用),没有产生拷贝构造,如果返回对象是一个当前函数局部域的局部对象,函数体结束会被销毁,引用返回可以认为是返回了一个野指针...C++支持内置类型隐式转换为类类型对象,需要有相关内置类型的构造函数。

    8510

    【C++】深入探索类和对象:初始化列表及其static成员与友元

    命名空间 缺省参数与函数重载 C++相关知识 类和对象上 类和对象中 引言 本章将分享C++中类和对象最后章节“深入探索类和对象:初始化列表及其static成员与友元”,希望通过这几篇关于类和对象文章可以帮助大家更好地理解类和对象的相关知识...一、构造函数体赋值 构造函数作用:在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...如果没有在成员变量声明中给缺省值(在初始化列表使用)或在初始化列表中完成初始化,编译器会给随机值,之后是函数体里面的事 2.2 如何使用初始化列表 能使用初始化列表就使用初始化列表,由于不管没有初始化列表...有些成员变量必须通过初始化列表完成初始化,不能进入函数体再赋值,比如:引用、const修饰成员 初始化列表的特性: 第一点:每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 第二点:类中包括以下成员...(不同平台就有不同的结果,需要看编译器优化情况和变量大小) 结果:图一:构造+拷贝 图二:构造+拷贝+拷贝 优化为 构造+拷贝,这里ret在f3函数结束前,使用aa拷贝ret 图三:构造+拷贝+拷贝优化构造

    11310

    【C++高潮——类与对象】:类的定义,访问限定符,类域,实例化,this指针,默认成员函数,构造,析构,拷贝构造,运算符重载,类型转换,static成员,友元,内部类,匿名对象,对象拷贝编译器优化

    (五)this指针 我们都知道,因为类里面的成员函数的实现是固定的,当不同对象调用类里面同一个成员方法的时候,成员函数是如何知道应该访问哪个对象的成员变量呢(如初始化,即给哪一个对象的成员变量赋值)?...构造函数的特点: 函数名与类名相同 没有返回值,连void也不需要写 对象实例化时,系统会自动调用对应的构造函数 支持重载,我们可以根据不同的需求定义多个构造函数。...在C++中,传值传参和传值返回时,都会发生拷贝。传值传参和传值返回的本质是创建一个新的对象或值,并将其传递给调用者,这个过程就叫做拷贝,是不可避免的,除非编译器进行了优化。...(但是,如果返回对象是当前函数局部域的局部对象,则返回对象在函数结束后会被销毁,此时引用返回会产生野引用,所以只有当返回对象在函数结束后依然存在时,才能使用引用返回。)...在 C++ 中,对象拷贝时的编译器优化是提升程序性能的关键机制。如何优化C++标准并没有严格规定,各个编译器会根据情况⾃⾏处理。

    2300

    【c++】 C语言的输入与输出&&C++的IO流&&STL空间配置器

    使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象...,因此这三个对象现在基本没有区别,只是应用场景不同 在使用时候必须要包含文件并引入std标准命名空间 注意: cin为缓冲流。...while(cin>>i)去流中提取对象数据时,调用的是operator>>,返回值是istream类型的对象,那么这里可以做逻辑条件值,源自于istream的对象又调用了operatorbool,operator...+文件IO流 C++根据文件内容的数据格式分为二进制文件和文本文件。...使用二级空间配置器 7.4 空间配置器的再次封装 在C++中,用户所需空间可能是任意类型的,有单个对象空间,有连续空间,每次让用户自己计算所需空间总大小不是很友好,因此SGI-STL将空间配置器重新再封装了一层

    10610
    领券