1.C++中不为引用分配空间,C++如何输出数值的16/8进制,和如何输出字符串首地址。
#include <iostream>
using namespace std;
void main(){
int a = 15;
int &ref_a = a;
//不为引用分配空间,它和所指变量的地址是相同的
cout << "变量a address: " << (&a) << endl;
cout << "变量a的引用的address:" << (&ref_a) << endl;
//C++ 输出 数值的16/8进制
cout << hex << a << endl;
cout << oct << ref_a << endl;
//c++ 输出字符串首地址
char *p="hello world";
cout << hex << (int)p << endl;
}
1) 声明时使用关键字inline.
2) 编译时在调用处用函数体替换了函数调用。从而节约了函数传递,控制转移等开销。
3) 注意:
内联函数体内不能有循环语句和switch语句。
内联函数的声明必须出现在内联函数第一次被调用之前。
对内联函数不能进行异常接口声明。
/*********内涵函数的举例********/
#include<iostream>
using namespace std;
inlinedouble CalArea(doubleradius)
{
return 3.14*radius*radius;
}
void main()
{
double r(3.0);
double area;
area=CalArea(r);
cout<<area<<endl;
}
3. 函数形参默认值
(1)默认形参值与函数的调用位置
调用出现在函数体实现之前时,默认形参值必须在函数原型中给出;
而当调用出现在函数体实现之后时,默认形参需在函数实现时给出。
int add(intx=5,int y=6);
void main(void){
add();//调用在实现前
}
int add(intx,inty) //实现
{
return x+y;
}
int add(intx=5,int y=6)
{
return x+y;
}
void main(void){
add();//调用在实现后
}
http://blog.youkuaiyun.com/csu_neil/article/details/6745137
(2)默认形参值的作用域
在相同的作用域内,默认形参值的说明应保持唯一;
但在不同的作用域内,允许说明不同的默认形参。
#include <iostream>
using namespace std;
int add(int x=1,int y=2);
int fun(void);
void main(void)
{
int add(int x=3,int y=4);
//使用局部默认形参值(实现3+4)
cout << add() <<endl;
//使用全局默认形参值(实现1+2)
cout << fun() <<endl;
}
int fun(void)
{
return add(); //使用全局默认形参值(实现1+2)
}
// 使用同一个函数实现
int add(int x, int y)
{
return x+y;
}
4.程序在内存中存储情况:栈,堆,代码区,全局(静态)区 ,常量区
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
4全局区(静态区) - 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区 域。 - 程序结束释放
5常量区 - 专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不 管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有 效。 另外,函数中的"adgfdf"这样的字符串存放在常量区。
#include <iostream>
#include <string.h>
using namespace std;
int a = 0; //全局初始化区
char *p1; //全局未初始化区
void main()
{
int b; //栈
char s[] = "abc"; //栈
char *p1; //栈
char *p2 = "123456"; // 123456\0在常量区,p2在栈上。
static int c = 1; //全局(静态)初始化区
//分配得来得10和20字节的区域就在堆区。
char *p3 = (char *)malloc(10);
char *p4 = (char *)malloc(20);
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
strcpy(p3, "123456");
}
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。 并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。
EBCDIC码:用8位二进制数表示一个字符,最多可以表示28=256个字符
汉字编码"(GB2312-80标准),简称国标码。是二字节码,用二个七位二进制数编码表示一个汉字。
目标程序:也称为"结果程序",是源程序通过翻译程序加工以后所生成的程序。
翻译程序:是指一个把源程序翻译成等价的目标程序的程序。
汇编程序:其任务是把用汇编语言写成的源程序,翻译成机器语言形式的目标程序。
编译程序:若源程序是用高级程序设计语言所写,经翻译程序加工生成目标程序,那么,该翻译程序就称 为"编译程序"。
解释程序:这也是一种翻译程序,同样是将高级语言源程序翻译成机器指令。它与编译程序不同点就在于:它是边翻译边执行的,即输入一句、翻译一句、执行一句,直至将整个源程序翻译并执行完毕。
程序的开发过程:
编辑–将源程序输入到计算机中,生成后缀为cpp的磁盘文件。
编译–将程序的源代码转换为机器语言代码。
连接–将多个源程序文件以及库中的某些文件连在一起,生成一个后缀为exe的可执行文件。
运行调试
可执行文件内存映像:
可执行文件除了含有可执行代码,还应含有运行时的数据组织信息,用以指导加载。
可执行代码段,存有全局变量、静态变量(对象)、静态成员、符号表等。还有函数和线程使用的栈数据段。
因为堆是动态申请、动态分配的,故不在可执行代码中预留。
符号表用于存放字面常量——被符号化了。该表是只读的,故体现为常。
6. 类的数据成员和成员函数需要注意的地方。
(1) 类的数据成员不可声明为extern、register,但可以是static或const。
(2) 类的数据成员不可声明时初始化。
(3) 应避免将数据成员放在公有接口中,因为那将使类丧失弹性和抽象性。
(4) 不要将类的数据成员与函数成员同名。
(5) 对成员数据的使用不再遵循“先声明后使用”的原则,即可以放置在类中的任意位置。
(6) 凡被调用的成员函数一定要有函数实现。
(7) 内联函数体中不要含有复杂结构(如循环语句和switch语句)
7.类的构造函数
(1) 在对象创建时由系统自动调用, 亦可由程序员显示调用,但不可用对象调用。
(2) 允许为内联函数、重载函数、带默认形参值的函数。
(3) 不可以是常函数,亦不可是虚函数。
(4) 天然具有类型转换功能,除非用explicit关闭。
(5) 既然构造函数是在对象被创建时使用特定的值构造对象的,还要按次序将所有成员初始化,这次序就是程序声明类时各成员的书写的次序。任何类的数据成员不管形态 如何千姿百态,这个次序是铁定的、嵌套的。
8.类的接口:
一个或多个构造函数;
有或没有拷贝构造函数;
有或没有析构函数;
对数据成员的设置,修改等;
对数据成员的取出,显示等;
对数据成员的计算,加工,处理等;
必要的运算符重载函数;
向外部作类型转换的转换函数。
9.若将拷贝构造函数设为私有,就切断了外界克隆对象的能力。程序员可以授权给别的成员函数完成此任务。
10.不要让成员函数返回一个非常引用或者指针。
详见:http://blog.youkuaiyun.com/whz_zb/article/details/6841085