【C++】三元操作符、创建并初始化C++对象、C++new关键字

news/2025/2/7 8:22:47/

C++的三元操作符

  • if的语法糖

例1

#include <iostream>
#include <string>static int s_Level = 1;
static int s_Speed = 2;int main()
{if (s_Level > 5){s_Speed = 10;}else{s_Speed = 5;}std::cin.get();
}

用三元操作符:

s_Speed = s_Level > 5 ? 10 : 5;

若s_Level > 5, 则s_Speed = 10; 否则 s_Speed = 5.

std::string rank = s_Level > 10 ? "Master" : "Beginner";

三元操作符的嵌套

s_Speed = s_Level > 5 ? s_Level > 10 ? 15 : 10 : 5;

优先级

s_Speed = s_Level > 5 && s_Level < 100 ? s_Level > 10 ? 15 : 10 : 5;

三元运算符尽量不要做嵌套

创建并初始化C++对象

栈对象

  • 有一个自动的生存期,由它声明的作用域决定的,只要变量超出作用域,其内存就会被释放
  • 作用域结束,栈就会被弹出,所有栈上的东西都会被释放

例2

#include <iostream>
#include <string>using String = std::string;class Entity
{
private:String m_Name;
public:Entity() : m_Name("Unknown") {}Entity(const String& name) : m_Name(name) {}const String& GetName() const { return m_Name; }
};int main()
{Entity entity;   // 栈对象,默认调用构造函数,C#或Java看起来奇怪,因为没有初始化std::cout << entity.GetName() << std::endl;Entity entity1("Cherno");   std::cout << entity1.GetName() << std::endl;std::cin.get();
}

在{}作用域外,e指向的内容被释放掉:

int main()
{Entity* e;{Entity entity;   std::cout << entity.GetName() << std::endl;Entity entity1("Cherno");e = &entity;std::cout << entity1.GetName() << std::endl;}std::cin.get();
}

不在栈上创建对象的原因:

  1. 作用域外
  2. 需要创建很多对象,栈很小

堆对象

只要创建了,就会一直存在,直到手动删除它

例3

#include <iostream>
#include <string>using String = std::string;class Entity
{
private:String m_Name;
public:Entity() : m_Name("Unknown") {}Entity(const String& name) : m_Name(name) {}const String& GetName() const { return m_Name; }
};
int main()
{Entity* e;{Entity entity;   // 栈对象,默认调用构造函数,C#或Java看起来奇怪,因为没有初始化std::cout << entity.GetName() << std::endl;Entity* entity1 = new Entity("Cherno");  // 堆对象,C#或Java常看到的e = entity1;std::cout << (*entity1).GetName() << std::endl;}std::cin.get();delete e;
}

作用域{}之外,e指向的内容仍然未被释放掉

C++new关键字

  • new: 在堆上分配内存
  • 用new需要找到连续的内存,搜索内存,像激光
  • 空闲列表:维护那些空闲字节的地址
  • new就是找到一块足够大的内存块,以满足我们的需求,然后它给我们一个指向那块内存的指针

例4

#include <iostream>
#include <string>using String = std::string;class Entity
{
private:String m_Name;
public:Entity() : m_Name("Unknown") {}Entity(const String& name) : m_Name(name) {}const String& GetName() const { return m_Name; }
};
int main()
{int a = 2;int* b = new int[50]; // 200 bytesEntity* e = new Entity[50];  // 得到50个连续的EntityEntity* e1 = new Entity();  // new不仅分配内存,还调用构造函数std::cin.get();
}

new的源代码:就是一个操作符,操作符重载
new是一个函数,有一个分配得到的内存大小,返回一个空指针
在这里插入图片描述
指针只是内存地址;返回指针,size作为参数,返回一个指向那个分配的内存块的指针

new int[50]
在这里插入图片描述
new关键字会调用隐藏在里面的c函数malloc
malloc函数代表内存分配,传入一个size,然后返回一个空指针

所以,相当于重写了代码:Entity* e2 = (Entity*)malloc(sizeof(Entity));, 但是这个不会调用构造函数

delete
在这里插入图片描述
操作符
有block内存块
和size作为参数
调用了C函数free(),free可以释放malloc申请的内存

delete[]
删除new的数组

指定new创建的地址

Entity* e3 = new(b) Entity();

假设Entity的大小是小于200字节的


http://www.ppmy.cn/news/60292.html

相关文章

Vuex从了解到实际运用(一)彻底搞懂什么是Vuex

vuex从了解到实际运用——彻底搞懂什么是vuex 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货什么是vuex全局状态管理使用状态管理工具后的好处vuex的实现原理vuex的组件通信1.多级组件通信2.同级组件通信使用vuex进行组件通信 关于vuex的小结 知识…

揭秘|从帕丽斯·希尔顿引领其帝国进入元宇宙学到的品牌建设经验

你是否曾想过&#xff0c;元宇宙是如何与世界上的知名品牌和名人达成合作的&#xff1f;在本期的文章中&#xff0c;我们邀请了 11:11 媒体的 Web3 和元宇宙总监 Cynthia Miller&#xff0c;一起探讨帕丽斯希尔顿如何通过 Parisland 和 Cryptoween 将她的帝国带入 The Sandbox&…

【C++】string 类的实现

目录 构造函数赋值重载关于浅拷贝 迭代器容量相关reserveresize 修改push_backappendinserterase关于npos 流运算符重载流插入流提取 构造函数 无参数构造和传参构造 通过对参数设置缺省值为空串""同时满足无参构造和传参构造成员 _size 和 _capacity 均是针对有效…

Web端3D轻量化引擎基于PBR渲染——仿真模拟更逼真

HOOPS Communicator在2021版本中&#xff0c;推出了基于PBR&#xff08;Physically Based Rendering&#xff09;的渲染特性以提供更高质量的渲染技术。 PBR将材料表示为一系列方程&#xff0c;这些方程对光如何从表面反射进行建模&#xff0c;再通过GPU上运行的着色器代码进行…

大学生学java编程的就业前景怎么样?我来聊聊自己的见解

今天兴哥想跟大家分享一个话题&#xff0c;就是学java到底好不好找工作。因为我发现很多粉丝朋友&#xff0c;之前可能并不是从事IT行业的&#xff0c;然后想转行来做这一行&#xff0c;或者是有些大四即将面临毕业的老哥&#xff0c;可能大学没有好好学习吧&#xff0c;然后专…

什么是GPT模型,GPT下载和国内镜像

什么是GPT模型&#xff0c;GPT模型是通过预训练的方式&#xff0c;采用无监督学习方式&#xff0c;大量语料输入&#xff0c;经过多次训练后得到模型。它能够自动学习并理解自然语言中的语义、句法和语法信息&#xff0c;并可以用于文本生成、对话系统、情感分析、机器翻译等自…

8个免费使用ChatGPT网站,部分可使用gpt4

ChatGPT 是一个基于 GPT 系列预训练语言模型的聊天机器人。 它可以回答用户的问题&#xff0c;进行闲聊&#xff0c;或者完成特定任务&#xff0c;如翻译、阅读理解等等。 ChatGPT 可以使用在各种场景中&#xff0c;包括客服、智能家居、娱乐等等。 它可以基于历史对话上下文…

selenium自动化面试题回答

1. 你们自动化测试&#xff0c;用的什么语言&#xff1f;什么工具&#xff1f;什么框架&#xff1f; 参考答案一&#xff1a; 我们做的是 Web UI 自动化&#xff0c;使用 selenium 自动化工具结合 unittest 框架来实现自动化测试&#xff0c;采用 python 脚本语言编写。 参考…