0
点赞
收藏
分享

微信扫一扫

C++ Primer Plus(第六版)第9章 函数——内存空间和名称空间

圣杰 2022-01-25 阅读 42

coordin.h

// coordin.h -- structure templates and function prototypes
// structure templates
#ifndef COORDIN_H_
#define COORDIN_H_

struct polar
{
	double distance;    // distance from origin
	double angle;        // direction from origin
};
struct rect
{
	double x;        // horizontal distance from origin
	double y;        // vertical distance from origin
};

// prototypes
polar rect_to_polar(rect xypos);
void show_polar(polar dapos);

#endif

file1.cpp 

// file1.cpp -- example of a three-file program
#include <iostream>
#include "coordin.h" // structure templates, function prototypes
using namespace std;
int main()
{
    rect rplace;
    polar pplace;

    cout << "Enter the x and y values: ";
    while (cin >> rplace.x >> rplace.y)  // slick use of cin
    {
        pplace = rect_to_polar(rplace);
        show_polar(pplace);
        cout << "Next two numbers (q to quit): ";
    }
    cout << "Bye!\n";
// keep window open in MSVC++
/*
    cin.clear();
    while (cin.get() != '\n')
        continue;
    cin.get();
*/
    return 0; 
}

file2.cpp 

// file2.cpp -- contains functions called in file1.cpp
#include <iostream>
#include <cmath>
#include "coordin.h" // structure templates, function prototypes

// convert rectangular to polar coordinates
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;      // returns a polar structure
}

// show polar coordinates, converting angle to degrees
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\n";
}

执行结果:

Enter the x and y values: 120 80
distance = 144.222, angle = 33.6901 degrees
Next two numbers (q to quit): 120 50
distance = 130, angle = 22.6199 degrees
Next two numbers (q to quit): q
Bye!

 autoscp.cpp

// autoscp.cpp -- illustrating scope of automatic variables
#include <iostream>
void oil(int x);
int main()
{
	using namespace std;

	int texas = 31;
	int year = 2011;
	cout << "In main(), texas = " << texas << ", &texas = ";
	cout << &texas << endl;
	cout << "In main(), year = " << year << ", &year = ";
	cout << &year << endl;
	oil(texas);//5 31 113 31
	cout << "In main(), texas = " << texas << ", &texas = ";
	cout << &texas << endl;
	cout << "In main(), year = " << year << ", &year = ";
	cout << &year << endl;
	// cin.get();
	return 0;
}

void oil(int x)
{
	using namespace std;
	int texas = 5;

	cout << "In oil(), texas = " << texas << ", &texas = ";
	cout << &texas << endl;
	cout << "In oil(), x = " << x << ", &x = ";
	cout << &x << endl;
	{                               // start a block
		int texas = 113;
		cout << "In block, texas = " << texas;
		cout << ", &texas = " << &texas << endl;
		cout << "In block, x = " << x << ", &x = ";//31
		cout << &x << endl;
	}                               // end a block
	cout << "Post-block texas = " << texas;//5
	cout << ", &texas = " << &texas << endl;
}

执行结果:

In main(), texas = 31, &texas = 00FCF764
In main(), year = 2011, &year = 00FCF758
In oil(), texas = 5, &texas = 00FCF670
In oil(), x = 31, &x = 00FCF684
In block, texas = 113, &texas = 00FCF664
In block, x = 31, &x = 00FCF684
Post-block texas = 5, &texas = 00FCF670
In main(), texas = 31, &texas = 00FCF764
In main(), year = 2011, &year = 00FCF758

 external.cpp

// external.cpp -- external variable
// compile with support.cpp
#include <iostream>
// external variable
double warming = 0.3;       // warming defined

// function prototypes
void update(double dt);
void local();

int main()                  // uses global variable
{
	using namespace std;
	cout << "Global warming is " << warming << " degrees.\n";
	update(0.1);            // call function to change warming
	cout << "Global warming is " << warming << " degrees.\n";
	local();                // call function with local warming
	cout << "Global warming is " << warming << " degrees.\n";
	// cin.get();
	return 0;
}

 support.cpp

// support.cpp -- use external variable
// compile with external.cpp
#include <iostream>
extern double warming;  // use warming from another file

// function prototypes
void update(double dt);
void local();

using std::cout;
void update(double dt)      // modifies global variable
{
	extern double warming;  // optional redeclaration
	warming += dt;          // uses global warming
	cout << "Updating global warming to " << warming;
	cout << " degrees.\n";
}

void local()                // uses local variable
{
	double warming = 0.8;   // new variable hides external one

	cout << "Local warming = " << warming << " degrees.\n";
	// Access global variable with the
	// scope resolution operator
	cout << "But global warming = " << ::warming;
	cout << " degrees.\n";
}

执行结果:

Global warming is 0.3 degrees.
Updating global warming to 0.4 degrees.
Global warming is 0.4 degrees.
Local warming = 0.8 degrees.
But global warming = 0.4 degrees.
Global warming is 0.4 degrees.

 twofile1.cpp  

// twofile1.cpp -- variables with external and internal linkage
#include <iostream>     // to be compiled with two file2.cpp
int tom = 3;            // external variable definition
int dick = 30;          // external variable definition
static int harry = 300; // static, internal linkage
// function prototype
void remote_access();

int main()
{
	using namespace std;
	cout << "main() reports the following addresses:\n";
	cout << &tom << " = &tom, " << &dick << " = &dick, ";
	cout << &harry << " = &harry\n";
	remote_access();
	// cin.get();
	return 0;
}

twofile2.cpp 

// twofile2.cpp -- variables with internal and external linkage
#include <iostream>
extern int tom;         // tom defined elsewhere
static int dick = 10;   // overrides external dick
int harry = 200;        // external variable definition,
						// no conflict with twofile1 harry

void remote_access()
{
	using namespace std;

	cout << "remote_access() reports the following addresses:\n";
	cout << &tom << " = &tom, " << &dick << " = &dick, ";
	cout << &harry << " = &harry\n";
}

执行结果:

main() reports the following addresses:
0072C000 = &tom, 0072C004 = &dick, 0072C008 = &harry
remote_access() reports the following addresses:
0072C000 = &tom, 0072C014 = &dick, 0072C010 = &harry

static.cpp 

// static.cpp -- using a static local variable
#include <iostream>
// constants
const int ArSize = 10;

// function prototype
void strcount(const char * str);

int main()
{
	using namespace std;
	char input[ArSize];
	char next;

	cout << "Enter a line:\n";
	cin.get(input, ArSize);
	while (cin)
	{
		cin.get(next);
		while (next != '\n')    // string didn't fit!
			cin.get(next);      // dispose of remainder
		strcount(input);
		cout << "Enter next line (empty line to quit):\n";
		cin.get(input, ArSize);
	}
	cout << "Bye\n";
	// code to keep window open for MSVC++
	/*
	cin.clear();
		while (cin.get() != '\n')
			continue;
		cin.get();
	*/
	return 0;
}

void strcount(const char * str)
{
	using namespace std;
	static int total = 0;        // static local variable
	int count = 0;               // automatic local variable

	cout << "\"" << str << "\" contains ";
	while (*str++)               // go to end of string
		count++;
	total += count;
	cout << count << " characters\n";
	cout << total << " characters total\n";//静态变量total只是在程序运行时被设置为0
	//以后在两次函数调用之间,其值将保持不变,所以能够记录读取的字符总数
}

执行结果:

Enter a line:
nice pants
"nice pant" contains 9 characters
9 characters total
Enter next line (empty line to quit):
thanks
"thanks" contains 6 characters
15 characters total
Enter next line (empty line to quit):
parting is such sweet sorrow
"parting i" contains 9 characters
24 characters total
Enter next line (empty line to quit):
ok
"ok" contains 2 characters
26 characters total
Enter next line (empty line to quit):

Bye

newplace.cpp 

// newplace.cpp -- using placement new
#include <iostream>
#include <new> // for placement new
const int BUF = 512;
const int N = 5;
char buffer[BUF];      // chunk of memory
int main()
{
	using namespace std;

	double *pd1, *pd2;
	int i;
	cout << "Calling new and placement new:\n";
	pd1 = new double[N];           // use heap
	pd2 = new (buffer) double[N];  // use buffer array
	for (i = 0; i < N; i++)
		pd2[i] = pd1[i] = 1000 + 20.0 * i;
	cout << "Memory addresses:\n" << "  heap: " << pd1
		<< "  static: " << (void *)buffer << endl;
	cout << "Memory contents:\n";
	for (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:\n";
	double *pd3, *pd4;
	pd3 = new double[N];            // find new address
	pd4 = new (buffer) double[N];  // overwrite old data
	for (i = 0; i < N; i++)
		pd4[i] = pd3[i] = 1000 + 40.0 * i;
	cout << "Memory contents:\n";
	for (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:\n";
	delete[] pd1;
	pd1 = new double[N];
	pd2 = new (buffer + N * sizeof(double)) double[N];
	for (i = 0; i < N; i++)
		pd2[i] = pd1[i] = 1000 + 60.0 * i;
	cout << "Memory contents:\n";
	for (i = 0; i < N; i++)
	{
		cout << pd1[i] << " at " << &pd1[i] << "; ";
		cout << pd2[i] << " at " << &pd2[i] << endl;
	}
	delete[] pd1;
	delete[] pd3;
	// cin.get();
	return 0;
}

执行结果:

Calling new and placement new:
Memory addresses:
  heap: 010C9518  static: 00A5D2D8
Memory contents:
1000 at 010C9518; 1000 at 00A5D2D8
1020 at 010C9520; 1020 at 00A5D2E0
1040 at 010C9528; 1040 at 00A5D2E8
1060 at 010C9530; 1060 at 00A5D2F0
1080 at 010C9538; 1080 at 00A5D2F8

Calling new and placement new a second time:
Memory contents:
1000 at 010C9228; 1000 at 00A5D2D8
1040 at 010C9230; 1040 at 00A5D2E0
1080 at 010C9238; 1080 at 00A5D2E8
1120 at 010C9240; 1120 at 00A5D2F0
1160 at 010C9248; 1160 at 00A5D2F8

Calling new and placement new a third time:
Memory contents:
1000 at 010C9518; 1000 at 00A5D300
1060 at 010C9520; 1060 at 00A5D308
1120 at 010C9528; 1120 at 00A5D310
1180 at 010C9530; 1180 at 00A5D318
1240 at 010C9538; 1240 at 00A5D320

namesp.h 

// namesp.h
#include <string>
// create the pers and debts namespaces
namespace pers
{
    struct Person
    { 
        std::string fname;
        std::string lname;
     };
    void getPerson(Person &);
    void showPerson(const Person &);
}

namespace debts
{
    using namespace pers;
    struct Debt
    {
        Person name;
        double amount;
    };
    
    void getDebt(Debt &);
    void showDebt(const Debt &);
    double sumDebts(const Debt ar[], int n); 
}

namesp.cpp 

// namesp.cpp -- namespaces
#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)
    {
        std::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 sumDebts(const Debt ar[], int n)
    {
        double total = 0;
        for (int i = 0; i < n; i++)
            total += ar[i].amount;
        return total;
    }
}

 usenmsp.cpp

// usenmsp.cpp -- using namespaces
#include <iostream>
#include "namesp.h"

void other(void);
void another(void);
int main(void)
{
    using debts::Debt;
	using debts::showDebt;
    Debt golf = { {"Benny", "Goatsniff"}, 120.0 };
    showDebt(golf);
    other();
    another(); 
	// std::cin.get();
	// std::cin.get();
    return 0;
}

void other(void)
{
    using std::cout;
    using std::endl;
    using namespace debts;
    Person dg = {"Doodles", "Glister"};
    showPerson(dg);
    cout << endl;
    Debt zippy[3];
    int i;
    
    for (i = 0; i < 3; i++)
        getDebt(zippy[i]);

    for (i = 0; i < 3; i++)
        showDebt(zippy[i]);
    cout << "Total debt: $" << sumDebts(zippy, 3) << endl;
    
    return;
}

void another(void)
{
    using pers::Person;;
    
    Person collector = { "Milo", "Rightshift" };
    pers::showPerson(collector);
    std::cout << std::endl; 
}

执行结果:

(选中3个执行文件进行编译) 

Goatsniff, Benny: $120
Glister, Doodles
Enter first name: Arabella
Enter last name: Binx
Enter debt: 100
Enter first name: Cleve
Enter last name: Delaproux
Enter debt: 120
Enter first name: Eddie
Enter last name: Fiotox
Enter debt: 200
Binx, Arabella: $100
Delaproux, Cleve: $120
Fiotox, Eddie: $200
Total debt: $420
Rightshift, Milo
举报

相关推荐

0 条评论