C++ 点滴积累(2)

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;

}


2.内联函数

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.csdn.net/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.程序在内存中存储情况:栈,堆,代码区,全局(静态)区 ,常量区

一般认为在c中分为这几个存储区   
 1   -   有编译器自动分配释放   
 2   -   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 
 3代码区  -  就是存放你的程序的编译后的可执行代码的地方了    
 4全局区(静态区) - 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区     域。   -   程序结束释放   
 5常量区 - 专门放常量的地方。   -   程序结束释放   

在函数体中定义的变量通常是在栈上,用malloc,   calloc,   realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不   管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有   效。 另外,函数中的"adgfdf"这样的字符串存放在常量区。   
全局数据区,代码区属于操作系统管辖的范围,无论是windows还是linux,他们都把一个可执行文件映射到内存中去,所以,整个应用程序的文件在一开始就被映射到一个特定地址开始的一段连续内存中去。根据系统的虚拟内存功能,当执行到特定的代码时,这段代码能够自的被载入到内存中。
比如:
#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");    

 }   
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。   
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。 并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。  
在栈上存取数据比通过指针在堆上存取数据快些。   
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.   
栈是先入后出的,一般是由高地址向低地址生长。

5.基本术语

ASCII码:用7位二进制数表示一个字符,最多可以表示27=128个字符
EBCDIC码:用8位二进制数表示一个字符,最多可以表示28=256个字符
汉字编码"(GB2312-80标准),简称国标码。是二字节码,用二个七位二进制数编码表示一个汉字。

源程序:  用源语言写的,有待翻译的程序
目标程序:也称为"结果程序",是源程序通过翻译程序加工以后所生成的程序。
翻译程序:是指一个把源程序翻译成等价的目标程序的程序。
汇编程序:其任务是把用汇编语言写成的源程序,翻译成机器语言形式的目标程序。
编译程序:若源程序是用高级程序设计语言所写,经翻译程序加工生成目标程序,那么,该翻译程序就称  为"编译程序"。
解释程序:这也是一种翻译程序,同样是将高级语言源程序翻译成机器指令。它与编译程序不同点就在于:它是边翻译边执行的,即输入一句、翻译一句、执行一句,直至将整个源程序翻译并执行完毕。


程序的开发过程:
编辑–将源程序输入到计算机中,生成后缀为cpp的磁盘文件。
编译–将程序的源代码转换为机器语言代码。
连接–将多个源程序文件以及库中的某些文件连在一起,生成一个后缀为exe的可执行文件。
运行调试


可执行文件内存映像:
可执行文件除了含有可执行代码,还应含有运行时的数据组织信息,用以指导加载。
可执行代码段,存有全局变量、静态变量(对象)、静态成员、符号表等。还有函数和线程使用的栈数据段。
因为堆是动态申请、动态分配的,故不在可执行代码中预留。
符号表用于存放字面常量——被符号化了。该表是只读的,故体现为常。

6. 类的数据成员和成员函数需要注意的地方。

(1)       类的数据成员不可声明为externregister,但可以是staticconst

(2)       类的数据成员不可声明时初始化。

(3)       应避免将数据成员放在公有接口中,因为那将使类丧失弹性和抽象性。

(4)       不要将类的数据成员与函数成员同名。

(5)       对成员数据的使用不再遵循“先声明后使用”的原则,即可以放置在类中的任意位置。

(6)       凡被调用的成员函数一定要有函数实现。

(7)       内联函数体中不要含有复杂结构(如循环语句和switch语句)

7.类的构造函数

 (1)    在对象创建时由系统自动调用, 亦可由程序员显示调用,但不可用对象调用。

 (2)    允许为内联函数、重载函数、带默认形参值的函数。

 (3)    不可以是常函数,亦不可是虚函数。

 (4)    天然具有类型转换功能,除非用explicit关闭。

 (5)    既然构造函数是在对象被创建时使用特定的值构造对象的,还要按次序将所有成员初始化,这次序就是程序声明类时各成员的书写的次序。任何类的数据成员不管形态                如何千姿百态,这个次序是铁定的、嵌套的。

8.类的接口:

   一个或多个构造函数;

   有或没有拷贝构造函数;

   有或没有析构函数;

   对数据成员的设置,修改等;

   对数据成员的取出,显示等;

   对数据成员的计算,加工,处理等;

   必要的运算符重载函数;

   向外部作类型转换的转换函数。


9.若将拷贝构造函数设为私有,就切断了外界克隆对象的能力。程序员可以授权给别的成员函数完成此任务。

10.不要让成员函数返回一个非常引用或者指针。

  详见:http://blog.csdn.net/whz_zb/article/details/6841085

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值