那么开始今天的学习。
首先是作用域和定义域的关系,这点已经清楚了所以不再记录。
然后是自动类型变量的存储问题,会自动存储到一个“栈”式的内存空间中,等到不再使用就会释放,因为函数层级也总是一层层的,所以内存的占用和释放顺序也满足先入后出的顺序。
另外,C中的寄存器变量register关键字在C++11中虽然还可以使用,但已经没有意义,等同于普通的自动变量。
静态变量,则有三种类型。定义在函数内部的自然只能在函数内使用,在函数外部定义static变量则可以在整个程序内使用,不加static关键字可以在程序的其他文件中使用。且静态变量的每位会自动初始化为0。
链接性为外部可以在整个程序包含的文件中使用的变量称为外部变量,也就是一般叫的全局变量。在其它文件中需要使用本文件定义的全局变量时,只需用extern申明即可。
“::”为作用域运算符,例如当有重名全局和局部变量num时,使用"::num"会调用全局变量,反之会调用局部变量。
局部静态变量不作记录。
volatile可以定义常变变量,指这个变量会有因为硬件更改(时间、温度等)而变化,防止编译器对于一些重复读取的程序作出优化。
mutable可以定义一些结构的成员,当整个结构为常量时该成员可以被修改。
可以在申明和定义函数时加static使函数无法被外部文件调用。
new的定位特性
char buffer1[50];
char buffer2[200];
int *p1,*p2;
p1=new (buffer1) new int[10];
p2=new (buffer2) new int[40];
即将原先无法确定分配位置的new分配的内存固定在之前定义的空间中(buffer1、bufffer2),需要注意的是其实就是自动使用该地址开始存储,所以会存在覆盖等情况,如果要在数组中定位放入要写成(buffer2+10*sizeof(int)),这样就会从10int位后开始存入。而delete不能删除非new创建的内存,这里指向的buffer自动变量将会自动删除。如果定位的也是new开创的内存则可以正常删除。
new的函数可以由用户自己定义和重载。
名称空间就是开辟一块区域,一块“声明空间”,在其中的声明都不会与其它名称空间的声明产生重名的问题。名称空间也可以包含在名称空间中。名称空间可以重复使用,可以加入新的声明或定义原先的声明。而使用名称空间的函数或者变量,就需要作用域运算符,例如"std::cout;"
而使用using可以避免总是需要用作用域运算符的麻烦
using std::cout;//这样可以在使用cout时不再需要作用域运算符,称为using声明
using namespace std;//而这样可以使整个名称空间的定义都可以直接使用,称为using编译
也可以在名称空间中使用嵌套,还可以使用别名,例如
namespace MEF=myth::elements::fire;
using MEF::flame;
当定义一个没有名字的名称空间时,相当于定义了一个内链的(只可以该文件内声明区域)使用的名称空间。
/**************************************************************************************************************************************/
看的是是扫描版,懒得打可以复制粘贴的程序。。。
不过最后一题还是做一下,熟悉 一下头文件+源文件的组合以及命名空间的使用。
另外和涉及了一点函数重载,这里直接贴代码吧。
//sale.h
#pragma once
namespace SALES
{
const int QUARTERS = 5;
struct Sales
{
double sales[QUARTERS];
double average;
double max;
double min;
};
void setSales(Sales &s, const double ar[], int n);
void setSales(Sales &s);
void showSales(const Sales &s);
}
//sale.cpp
#include "stdafx.h"
#include "sale.h"
#include<iostream>
namespace SALES
{
using std::cout;
using std::cin;
using std::endl;
void setSales(Sales &s, const double a[], int n)
{
if (n > QUARTERS)n = QUARTERS;
double sum=0;
s.average = s.max = s.min = a[0];
for (int i = 0; i < n; i++) {
s.sales[i] = a[i];
s.average = (s.average + a[i]) / 2;
if (a[i] > s.max)s.max = a[i];
if (a[i] < s.min)s.min = a[i];
}
}
void setSales(Sales &s)
{
double a[QUARTERS];
cout << "Enter " << QUARTERS << " numbers: " << endl;
for (int i = 0; i < QUARTERS; i++)
cin >> a[i];
setSales(s, a, QUARTERS);
}
void showSales(const Sales &s)
{
for (int i = 0; i < QUARTERS; i++)
cout << s.sales[i] << " ";
cout << endl;
cout << "The average is: " << s.average << endl;
cout << "The max is: " << s.max << endl;
cout << "The min is: " << s.min << endl;
}
}
//main.cpp
#include "stdafx.h"
#include "sale.h"
#include<iostream>
int main()
{
using namespace SALES;
double darray[QUARTERS] = { 12, 3.5, 9.7, -11.7, 3.14 };
Sales S1, S2;
setSales(S1);
showSales(S1);
setSales(S2, darray, QUARTERS);
showSales(S2);
return 0;
}
那么今天的学习就到这里,明天就会学习类了。