《C++PrimerPlus》第9章 内存模型和名称空间

9.1 单独编译

Visual Studio中新建头文件和源代码

通过解决方案资源管理器,如图所示:

分成三部分的程序(直角坐标转换为极坐标)

头文件coordin.h

#ifndef __COORDIN_H__ // 如果没有被定义过
#define __COORDIN_H__struct polar {double distance;double angle;
};struct rect {double x;double y;
};polar rect_to_polar(rect xypos);
void show_polar(polar dapos);#endif // 如果被定义过了(啥也不做)

源代码file1(放置main函数,调用其他函数)

#include <iostream>
#include "coordin.h" // 尖括号表明去系统目录找,双引号表明去当前目录找
using namespace std;int main(){rect rplace;polar pplace;cout << "Enter the x and y values: ";while (cin >> rplace.x >> rplace.y) {pplace = rect_to_polar(rplace);show_polar(pplace);cout << "Next two numbers (q to quit): ";}cout << "Bye!" << endl;return 0;
}

源代码file2(其他函数的定义)

#include <iostream>
#include <cmath>
#include "coordin.h"polar rect_to_polar(rect xypos) {using namespace std;polar answer;answer.distance = sqrt(xypos.x * xypos.x + xypos.y * xypos.y);answer.angle = atan2(xypos.y, xypos.x);return answer;
}void show_polar(polar dapos) {using namespace std;const double Rad_to_deg = 57.29577951;cout << "distance = " << dapos.distance;cout << ", angle = " << dapos.angle * Rad_to_deg;cout << " degrees" << endl;
}

9.2 存储持续性、作用域和链接性

全局变量和局部变量

头文件support.h

#ifndef __SUPPORT_H__
#define __SUPPORT_H__
#include <iostream>extern double warming; // 声明外部变量(不要赋值)void update(double dt);
void local(void);#endif

源代码external.cpp

#include <iostream>
#include "support.h"
using namespace std;double warming = 0.3;int main(){cout << "Global warming is " << warming << endl;update(0.1);cout << "Global warming is " << warming << endl;local();return 0;
}

源代码support.cpp

#include "support.h"
using namespace std;void update(double dt) {warming += dt;cout << "Updating global warming to " << warming << endl;
}void local(void) {double warming = 0.8; // 局部变量,只在local内部可见cout << "Local warming is " << warming << endl;// 作用域解析运算符(::),放在变量名前表示使用变量的全局版本cout << "But global warming is " << ::warming << endl;
}

static限定符用于全局变量

源代码twofile1.cpp

#include <iostream>
using namespace std;int tom = 3;
int dick = 30;
static int harry = 300; // 仅在twofile1.cpp可见
void remote_access(void);int main() {cout << "main() reports the following addresses: " << endl;cout << "&tom = " << &tom << endl;cout << "&dick = " << &dick << endl;cout << "&harry= " << &harry << endl;remote_access();return 0;
}

源代码twofile2.cpp

#include <iostream>
using namespace std;extern int tom; // 声明为外部变量(来自twofile1.cpp)
static int dick = 10; // 只在twofile2.cpp中可见
int harry = 200; // 新建一个全局变量void remote_access(void) {cout << "remote_access() reports the following addresses:" << endl;cout << "&tom = " << &tom << endl;cout << "&dick = " << &dick << endl;cout << "&harry= " << &harry << endl;
}

static限定符用于局部变量(统计字符串的字符个数)

#include <iostream>
using namespace std;const int ArSize = 10;
void strcount(const char * str);int main(){char input[ArSize];char next;cout << "Enter a line: " << endl;cin.get(input, ArSize);while (cin) {cin.get(next);// 如果输入的内容大于10个字符,则用cin.get全部消耗掉while (next != '\n')cin.get(next);strcount(input);cout << "Enter next line (empty line to quit):" << endl;cin.get(input, ArSize);}cout << "Bye!" << endl;return 0;
}void strcount(const char * str) {// 局部变量加static,无论调用多少次这个函数,该变量只会在第一次初始化static int total = 0;int count = 0;while (*str) {count++;str++;}total += count;cout << count << " characters." << endl;cout << total << " characters total." << endl;
}

定位new运算符的使用

#include <iostream>
#include <new>
using namespace std;const int BUF = 512;
const int N = 5;
char buffer[BUF];int main(){double *pd1, *pd2;int i;cout << "Calling new and placement new: " << endl;// 用常规new运算符为N个double类型开辟内存空间pd1 = new double[N];// 用定位new运算符为N个double类型开辟内存空间pd2 = new (buffer) double[N];// 赋值for (int i = 0; i < N; i++) {pd2[i] = pd1[i] = 1000 + 20.0 * i;}cout << "pd1 = " << pd1 << ", buffer = " << (void *)buffer << endl;// 打印pd1和pd2的地址for (int i = 0; i < N; i++) {cout << pd1[i] << " at " << &pd1[i] << ";";cout << pd2[i] << " at " << &pd2[i] << endl;}cout << "\nCalling new and placement new a second time: " << endl;double *pd3, *pd4;pd3 = new double[N];pd4 = new(buffer) double[N]; // 会覆盖掉原来地址里的值for (int i = 0; i < N; i++) {pd4[i] = pd3[i] = 1000 + 40.0 * i;}for (int i = 0; i < N; i++) {cout << pd3[i] << " at " << &pd3[i] << ";";cout << pd4[i] << " at " << &pd4[i] << endl;}cout << "\nCalling new and placement new a third time: " << endl;delete[] pd1;pd1 = new double[N]; // 删了重新new(申请和之前相同的地方)pd2 = new(buffer + N * sizeof(double)) double[N]; // 地址往后偏移5个double类型的长度for (int i = 0; i < N; i++) {pd2[i] = pd1[i] = 1000 + 60.0 * i;}for (int i = 0; i < N; i++) {cout << pd1[i] << " at " << &pd1[i] << ";";cout << pd2[i] << " at " << &pd2[i] << endl;}delete[] pd1;delete[] pd3; // pd2和pd4是定位new开辟出来的,delete不能用于定位newreturn 0;
}

9.3 名称空间

当名称空间和声明区域定义了相同名称(伪代码)

namespace Jill{double bucket(double n) {...}double fetch;struct Hill {...};
}
char fetch; // 全局变量
int main(){using namespace Jill; // 使用using编译指令Hill Thrill; // 创建一个Jill::Hill 的结构double water = bucket(2); // 使用Jill::bucket()double fetch; // 不会出错,Jill::fetch被隐藏cin >> fetch; // 读入一个数据到局部变量fetchcin >> ::fetch; // 读入一个数据到全局变量fetchcin >> Jill::fetch; // 读入一个变量到Jill::fetch...
}int foom(){Hill top; // 会出错Jill::Hill crest; // 可用
}

名称空间示例(打印人名及欠款)

头文件namesp.h

#pragma once
#include <string>namespace pers {struct Person {std::string fname;std::string lname;};void getPerson(Person &rp);void showPerson(const Person &rp);
}namespace debts {using namespace pers;struct Debt {Person name;double amount;};void getDebt(Debt &rd);void showDebt(const Debt &rd);double sunDebts(const Debt ar[], int n);
}

源代码namessp.cpp

#include <iostream>
#include "namesp.h"int main() {using debts::Debt;using debts::showDebt;Debt golf = { {"Micheal", "Jordan"}, 120.0 };showDebt(golf);return 0;
}

源代码namesp.cpp

#include <iostream>
#include "namesp.h" // 头文件放结构体类型、函数原型声明namespace pers {using std::cout;using std::cin;void getPerson(Person &rp) {cout << "Enter first name: ";cin >> rp.fname;cout << "Enter last name: ";cin >> rp.lname;}void showPerson(const Person &rp) {cout << rp.lname << ", " << rp.fname;}
}namespace debts {void getDebt(Debt &rd) {getPerson(rd.name);std::cout << "Enter debt: ";std::cin >> rd.amount;}void showDebt(const Debt &rd) {showPerson(rd.name);std::cout << ": $" << rd.amount << std::endl;}double sunDebts(const Debt ar[], int n) {double total = 0;for (int i = 0; i < n; i++) {total += ar[i].amount;}return total;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.平衡优化器算法4.实验参数设定5.算法结果…

全志XR806基于FreeRTOS下部署竞技机器人先进模糊控制器

前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发&#xff0c;同时更愿意将其实现到具体项目中。秉承以上原则&#xff0c;发现大家的重心都放在开发中的环境构建过程&#xff0c;缺少了不少实际应用场景的运用&am…

AIGC: 关于ChatGPT中API接口调用相关准备工作

ChatGPT之API接口相关 通过页面和GPT交流获取信息相比直接调用GPT的API而言是非常有限的 页面上的GPT是比较封闭的&#xff0c;而且只允许我们去输入文本的信息 我们需要借助GPT的API开发来激发AI工具的无限可能&#xff0c;实现更多个性化需求 1 &#xff09;使用API 使用A…

【LeetCode 0167】【数组】两数之和(2)

https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/ 题解 二分查找O(nlogn)&#xff1a;有序自然想到二分查找&#xff0c;从左往右迭代数组每个元素num&#xff0c;在后面剩下的数组元素中二分查找到target-num var twoSum function(numbers, target) {con…

JavaWeb 项目 厉不厉害你鸡哥

来源 源码&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>一起打篮球嘛</…

【WebSocket】通信协议基于 node 的简单实践和心跳机制和断线重连的实现

前后端 WebSocket 连接 阮一峰大佬 WebSocket 技术博客 H5 中提供的 WebSocket 协议是基于 TCP 的全双工传输协议。它属于应用层协议&#xff0c;并复用 HTTP 的握手通道。它只需要一次握手就可以创建持久性的连接。 那么什么是全双工呢&#xff1f; 全双工是计算机网络中的…

聊聊接口最大并发处理数

文章目录 前言并发和并行并发&#xff08;Concurrency&#xff09;并行&#xff08;Parallelism&#xff09;思考一下 前言 生活在 2023 年的互联网时代下&#xff0c;又是在国内互联网越发内卷的背景下&#xff0c;相信大家面试找工作、网上学习查资料时都了解过互联网系统设…

如何计算数据泄露的成本

现在&#xff0c;几乎所有类型的组织每天都在发生企业 IT 网络遭到破坏的情况。它们是任何合规官员最担心的问题&#xff0c;并且找出更好的方法来防止它们或从中恢复是合规官员永远不会远离的想法。 但数据泄露的实际成本是多少&#xff1f;该数字从何而来&#xff1f;当您获…

考试复习

选择20道 填空10道 判断10道 简答4-5道 编程题2道 一、选择题 1.js中更改一个input框的值&#xff1a; <input ida type"text" value"123456"> 通过a.value改变他的值 方法&#xff1a; 在script标签中通过id获得该输入框对象&#xff0c;然…

纯净版ISO镜像下载大全(Windows、Linux、mac)

目录 一、前言介绍 前言必读 介绍 二、获取ISO镜像方式 &#xff08;一&#xff09;官方镜像下载 &#xff08;二&#xff09;获取下载方式 ps&#xff1a;回复的内容都是小写的 Windows操作系统 1.windows XP系统 2.Windows 7系统 3.Windows10系统 4.Windows11系…

Flutter应用程序的加固原理

在移动应用开发中&#xff0c;Flutter已经成为一种非常流行的技术选项&#xff0c;可以同时在Android和iOS平台上构建高性能、高质量的移动应用程序。但是&#xff0c;由于其跨平台特性&#xff0c;Flutter应用程序也面临着一些安全风险&#xff0c;例如反编译、代码泄露、数据…

Python的正则表达式使用

Python的正则表达式使用 定义使用场景查替换分割 常用的正则表达符号查原字符英文状态的句号点 .反斜杠 \英文的[]英文的()英文的?加号 星号 *英文状态的大括号 {} 案例 定义 正则表达式是指专门用于描述或刻画字符串内在规律的表达式。 使用场景 无法通过切片&#xff0c;…

numpy知识库:深入理解numpy.resize函数和数组的resize方法

前言 numpy中的resize函数顾名思义&#xff0c;可以用于调整数组的大小。但具体如何调整&#xff1f;数组形状变了&#xff0c;意味着数组中的元素个数发生了变化(增加或减少)&#xff0c;如何确定resize后的新数组中每个元素的数值呢&#xff1f;本次博文就来探讨并试图回答这…

electron调用dll问题总汇

通过一天的调试安装&#xff0c;electron调用dll成功&#xff0c;先列出当前的环境&#xff1a;node版本: 18.12.0&#xff0c;32位的&#xff08;因为dll为32位的&#xff09; VS2019 python node-gyp 1、首先要查看报错原因&#xff0c;通常在某一行会有提示&#xff0c;常…

什么是基线和 x-height

前言 在排版和字体设计领域&#xff0c;了解和掌握基线&#xff08;baseline&#xff09;和 x 高度&#xff08;x-height&#xff09;的概念是至关重要的。这两个术语描述了字母在视觉上是如何对齐的&#xff0c;以及它们相对于其他字母的大小。通过对这两个概念的深入了解&…

elk+filebeat+kafka集群部署

EFK实验架构图&#xff1a; 实现高并发&#xff0c;无需指定logstash 3台esfile&#xff0c;3台kafka 20.0.0.10 esfile 20.0.0.20 esfile 20.0.0.30 esfile 20.0.0.11 kafka 20.0.0.12 kafka 20.0.0.13 kafka在es1主机上解压filebeat cd filebeat 安装nginx服务 vim /usr/loc…

无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv7开发构建电力设备螺母缺销高分辨率图像小目标检测系统

传统作业场景下电力设备的运维和维护都是人工来完成的&#xff0c;随着现代技术科技手段的不断发展&#xff0c;基于无人机航拍飞行的自动智能化电力设备问题检测成为了一种可行的手段&#xff0c;本文的核心内容就是基于YOLOv7来开发构建电力设备螺母缺销检测识别系统&#xf…

软件设计师——计算机网络(一)

&#x1f4d1;前言 本文主要是【计算机网络】——软件设计师计算机网络的题目&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

su与 su -导致邮箱收件异常

先贴代码 rootlocalhost postfix]# su - mail-user1 Last login: Thu Nov 30 17:07:14 CST 2023 on pts/0 [mail-user1localhost ~]$ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/mail-user1": 3 messages > 1 root …

Arduino、ESP8266、HTML相关知识点记录

C代码 const char *ssid "********"; // 这里定义将要建立的WiFi名称。 const char *password "********"; // 这里定义将要建立的WiFi密码。 多WiFi连接&#xff1a; wifiMulti.addAP("**…