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

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

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

15220

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

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

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

C++实现一个简单String类

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

1.5K10

C++】类和对象 (下篇)

我们学习了C++六个默认成员函数,其中构造函数用于对对象进行初始化,即在创建对象时,编译器会自动调用构造函数,给对象各个成员变量一个合适初始值; class Date { public: Date...,编译器会自动将其中一个变量类型转换为另一个变量类型;之前 C++引用 引用我们也接触过,比如: int main() { int a = 0; double b = a; const...,然后我们再对这个临时变量进行引用;同时由于临时变量具有常性,所以我们需要使用 const 修饰; 上面这些知识我前面 C++引用 引用部分有详细介绍,如果有遗忘小伙伴可以去复习一下; 2...C++,我们使用 cin 和 cout 配合流插入 >> 与流提取 << 符号来完成数据输入输出,并且它们能自动识别内置类型; 那么它们是如何做到输入与输出数据以及自动识别内置类型呢?...C++,除了用类名+对象名创建对象外,我们还可以直接使用类名来创建匿名对象,匿名对象和正常对象一样,创建时自动调用构造函数,销毁时自动调用析构函数;但是匿名对象生命周期只有它定义那一行,下一行就会立马销毁

45300

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

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

1.6K20

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

51730

《挑战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方式声明创建

92010

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

C++笔记:运算符重载

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

92020

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 其实istreamgetline是全局函数getline函数基础上,又多了一个终止读取条 件,即根据已读取字符个数来判定,实际上是读取n-1个字符,因为最后要为...这句从 语法上看,是    sentry是一个class, _Ok是sentry类一个const对象,构造这个对象时需要传入两个 参数    第一个是流对象自身引用,第二个表示对空白字符(如空格、制表符...sentry类构造函数    * 初始化时设置,设置过程比较麻烦,这里不做赘述(其实我也没看十分明白)。   ...由于是传引用,所以不论调用哪个,都会改变原文件流get指针所指向位置。

1.5K40

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: 每次写操作前均定位到文件尾部

83730

C++基础知识一

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

78700

C++链式操作

(2)对赋值操作符进行重载,如果返回是类对象,那么链式赋值操作必须借助于拷贝构造函数才能进行。这样不懂那会有较大运行开销,还要编写正确拷贝构造函数。考察下面的程序。...: image.png 可以看到,连续两次赋值操作过程,一共两次调用拷贝构造函数。...第一次发生在执行c2=c1操作,函数返回值(临时对象)是由c1构造,这时发生了一次拷贝构造函数调用;第二次发生在为c3赋值时候,赋值运算返回值仍然是一个Complex类对象,这时又发生了一次拷贝构造函数调用...,原因是赋值操作符函数返回Complex类引用,不用产生一个新临时对象,这样大大提高了程序运行效率。...operator<<(ostream&, className&); 如果操作符函数返回istream或ostream类对象,而不是引用,会出现编译错误。

1.2K10

C++核心编程学习

:int a = 10; int &b = a; int c = 233; &b = c 3、做函数参数,可以达到指针效果 4、引用做函数返回值,可以作为左值 5、引用本质C++内部实现是一个指针常量...;但是会提供拷贝构造函数; 如果用户自己定义了拷贝构造函数, 那么编译器其他构造函数都不会提供; 5、深拷贝和浅拷贝 进行拷贝构造函数时候,相当于是把一个对象所有内容复制到了另一个对象之中,但是如果在原来对象里存在堆区数据...) Person p; 空对象占用内存空间为1;C++编译器会给每个空对象也分配一个字节, 是为了区分空对象占内存位置; 每个空对象都有个独一无二内存地址; 10、this...父类,所有的非静态成员变量(包括private)都要继承到子类(不论权限);只是子类访问时候,编译器会把private类型数据隐藏起来 先构造父亲,再构造儿子;;先析构儿子,再构造父亲 (4...:(1)有继承关系, (2)子类重写父类虚函数,(3)一般父类指针或者引用,执行子类对象使用 (3)静态多态地址早绑定:在编译阶段;;;;动态多态地址晚绑定:在运行阶段 #include<iostream

36910

C++ 重载运算符 继承 多态 (超详细)

(3) 友元函数重载+重载输入输出流(用稀烂用多比较重要) 左右操作数类型不同时上述重载方式都不能正常使用,这时候就需要两个操作数,类外重载,因类外不能直接调用,所以要把该函数声明为类友元。...(4)派生类静态数据成员 基类定义静态成员,将被所有派生类共享 2、基类初始化: (5)派生类初始化 派生类构造函数声明格式为: 派生类构造函数(变元表):基类(变元表)、对象成员1(...这个规则可以简述为能放基类地方,放派生类一定可以使用,程序需要使用基类对象地方都可以用公有派生类对象代替。...=demo2; //派生类对象可以初始化基类引用; Base *Bpo=&demo2;//派生类对象可以赋给指向基类对象指针;//多态实现方法 主要是派生类中一定包含基类中所有成员,使用,一定可以找到对应成员...在编译时候能够确定对象所调用成员函数地址则为静态联编,一般调用方式; 动态联编:指的是程序运行时候动态地进行,根据当时情况来确定调用哪个同名函数,父类指针指向哪个子类,就调用哪个子类同名函数

1K21

C++】STL简介 -- string 使用及其模拟实现

STL是C++优秀作品,有了它陪伴,许多底层数据结构以及算法都不需要自己重新造轮子,直接使用即可,大大提高了解题和开发效率;因此,STL 笔试、面试以及工作其都是一个被重点考察对象。...capacity; 字符串有效长度 size; 引用计数 refcount ;(拷贝构造时默认使用浅拷贝来提高效率 + 使用引用计数来保证同一块堆空间不被析构多次) 指向堆空间指针,用来存储字符串。...n, char c) 用n个c字符来构造string类对象 5、Iterators Iterators 是C++迭代器,大家可以把它当成指针来理解,当然,并不是所有迭代器底层都是用指针实现...c_str 某些场景只支持对C形式字符串,即字符数组进行操作,比如网络传输、fopen,而不支持对C++ string 对象进行操作,所以 string 提供了c_str,用于返回C形式字符串...: getline C++ cin 和 C语言中 scanf 函数都是以空格、换行、Tab 作为不同数据之间分割标志,即当它们遇到这些符号时就会停止读取: C语言提供了 gets 函数来读取一行字符

46600

sstream类详解

构造字符串流时候,空格会成为字符串参数内部分界,例子对a,b对象输入"赋值"操作证明了这一点,字符串空格成为了整型数据与浮点型数据分解点,利用分界获取方法我们事实上完成了字符串到整型对象与浮点型对象拆分转换过程...而且,转换结果保存在stringstream对象内部缓冲。你不必担心缓冲区溢出,因为这些对象根据需要自动分配存储空间。 你编译器支持吗?...对象 如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法; 多次转换重复使用同一个stringstream(而不是每次都创建一个新对象对象最大好处在于效率...stringstream对象构造和析构函数通常是非常耗费CPU时间类型转换中使用模板 你可以轻松地定义函数模板来将一个任意类型转换到特定目标类型。...istream 引用需要 iostream 对象表现得像 ostream 地方,调用 get_ostream() 函数返回一个 ostream 引用

1.3K10
领券