一、C语言中meset与mecopy
memset原型:extern void *memset(void *buffer, int c, int count);
memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;(例中:将某块内存 buffer中当前位置后面的count 个字节用 用c 替换并返回指针指向的buffer)例:
char a[100];
memset(a, '\0', sizeof(a));
memcpy原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:
char a[100],b[50];
memcpy(b, a, sizeof(b));//copy a 的大小为b内存大小的字节到b(a->b)
注意如用sizeof(a),会造成b的内存地址溢出。
二、C语言中符号->
用法
三、C语言中的main函数的两个参数各表达什么意思
int main (int argc, char* argv[])
{
return **;
}
C语言规定:argc(第一个形参)必须是整形变量,argv(第二个形参)必须是指向字符串的指针数组
三、C++::
与:
表现
双冒号 :: 操作符被称为域操作符(scope operator),含义和用法如下:
1.在类外部声明成员函数。void Point::Area(){};
2.调用全局函数;表示引用成员函数变量及作用域,作用域成员运算符 例:System::Math::Sqrt() 相当于System.Math.Sqrt()。
3.调用类的静态方法: 如:CDisplay::display()。
把域看作是一个可视窗口全局域的对象在它被定义的整个文件里,一直到文件末尾都是可见的。在一个函数内被定义的对象是局域的(local scope), 它只在定义其的函数体内可见。每个类维持一个域,在这个域之外 ,它的成员是不可见的。类域操作符告诉编译器后面的标识符可在该类的范围内被找到。
四、C语言多态表现形式之虚函数Virtual
Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。(关于虚拟机制是如何实现的,参见Inside the C++ Object Model ,Addison Wesley 1996)
class Base
{
public:Base(){}
public:
virtual void print(){cout<<"Base";}
};
class Derived:public Base
{
public:Derived(){}
public:
void print(){cout<<"Derived";}
};
int main()
{
Base *point=new Derived();
point->print();
}
Output:
Derived
这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:
(1) 重载的几个函数必须在同一个类中;
覆盖的函数必须在有继承关系的不同的类中
(2) 覆盖的几个函数必须函数名、参数、返回值都相同;
重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。
(3) 覆盖的函数前必须加关键字Virtual;
重载和Virtual没有任何瓜葛,加不加都不影响重载的运作