随笔分类 - C++拾遗
摘要:#include class A{public: virtual void print() { coutprint();}void printS(A &a){ a.print();}void main(){ A a,*pa,*pb,*pc; B b; C c; pa=&a; pb=&b; pc=&c; a.print(); b.print(); c.print(); pa->print(); pb->print(); pc->print(); print(a); print(b); print(c); print(pa); print(pb);
阅读全文
摘要:C++虚继承的作用C++虚继承可以防止多重继承产生的二义性问题。 虚继承,就是在被继承的类前面加上virtual关键字,这时被继承的类称为虚基类,如下面代码中的base类。虚继承在多重继承的时可以防止二义性。 class base class derived1 : virutal public base class derived2 : virtual public base class derived3 : public derived1, public derived2以上的代码如果用到了base中的某个成员变量就不会产生二义性。和#progma once在头文件中的作用类似。请看下面的例
阅读全文
摘要:1、C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,被做为隐式类型转换使用。比如:int i;float f = 166.7f;i = static_cast(f);此时结果,i的值为166。2、C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:int i;char *p = "This is a example.";i = reinterpret_cast(p);此时结果,i与p的值是完全相同的。reinte
阅读全文
摘要:面向对象的三个基本特征是:封装、继承、多态。封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composi
阅读全文
摘要:函数模板可以用来创建一个通用的函数,以支持多种不同形参,避免重载函数的函数体重复设计。它的最大的特点就是吧函数实用的数据类型作为参数。定义的一般形式:template 函数返回值类型 函数名(参数表){ 函数体 }例如:templat T1 fun(T1 a,T2 b){ T2=d;、、、、、、}如果主调函数中有:int x; double y;、、、、fun(x,y);则系统将用实参x的数据类型int和y的数据类型double的代替函数模板中的T1和T2,生成模板函数int fun(int a,double b){ double d;、、、、}# include # include temp
阅读全文
摘要:抽空总结下对一直以来对C++多态性的一点个人理解:1.什么叫早绑定和晚绑定?早绑定指在对象声明的时候就和它的类型建立了关联。晚绑定是指代码在运行时再检查对象是否提供了我们所需要的方法和属性。静态关联(早绑定)和动态关联(晚绑定)。2.什么叫多态性?一个接口,多种方法。3.多态性和非多态性的区别?多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并产生代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址需要在运行时才确定,这就属于晚绑定。4.一个不带虚函数的类(无成员变量)大小?空类大小不为0,为1。5.一个带虚函数的类(无成员
阅读全文
摘要:对于字符串的存储有多种形式,下面来看一下。上代码: 1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 char *s="ABCDE";//是将一个字符串常量赋值给一个指针变量 8 char s1[]={"ABCDE"}; 9 //char s[5]={"ABCDE"};10 char s2[6]={"ABCDE"};11 char s3[5]={'A','B','C','D
阅读全文
摘要:作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。这里提供一个比较好的链接,是关于STL用法的系列文章 http://www.cnblogs.com/alionxd/category/471846.html,还有一个更专业的http://morningspace.51.net/resource/stlintro/stlintro.html年代有点久远了。
阅读全文
摘要:多态归结起来有四种:重载多态,强制多态,包含多态,参数多态。运算符重载实际上是函数重载。上代码:重载运算符 ++ 分为前置和后置,其中重载函数带参数的是后置。#include using namespace std; class A{ int n; int k; int m; public: A(){} A(int n,int k,int m):n(n),k(k),m(m){} A& operator++(){ //++i m++; return *this; } ...
阅读全文
摘要:C++标准类库将面向对象的串的概念加入到C++语言中,预定义了字符串类(string).string类提供了对字符串进行处理的所需操作。使用string了需要包含头文件string。string类封装了串的属性并提供了一系列允许访问这些属性的函数。下面总结一下string类的构造函数,几个常用的成员函数和操作。、创建string对象字符串的操作,需要调用其构造函数,构造出一个 string 对象,为随后添加的字符分配内存,并初始化 string 对象的内部变量。如下是它的几个常用的构造函数原型。1.string();//默认的构造函数,用于创建一个不包含任何非空字符的 string 对象,长度
阅读全文
摘要:我在看一些C++方面的教材时,一些书上这样写到:用New操作可以创建多维数组,new类型名T[下标表达式1][下表表达式2]...。数组的个数是除最左边一位外各位下表表达式的乘积。如:float(*fp)[25][10];fp=newfloat[10][25][10];//用new操作产生了一个指向25*10的二维数组的指针;而,这么写:float *fp=new float[10][25][10]; 是错误的,原因是什么呢?下面试分析之:实际上,不难发现,指针总是比它指向的数组对象少一维。****一维数组如;float *fp=new float[10];指针fp开始指向的是一维数组的首地址
阅读全文
摘要:链表在C/C++中是一种比较重要的数据结构,属于线性表.写了较好理解的代码,方便进行理解和实际的操作,为了方便理解及简化参数,第一个程序将head及,current指针设为全局变量. 1 #include <iostream> 2 using namespace std; 3 4 struct Node 5 { 6 int info; 7 Node *next; 8 }; 9 10 Node *head=NULL;11 Node *current=NULL;12 13 void CreateList()14 {15 head=new Node();16 hea...
阅读全文
摘要:类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后的学习和面试中,在此类问题上不在被动。 静态类成员包括静态数据成员和静态函数成员两部分。 一.静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。举例如下: 1 xxx.h文件
阅读全文
摘要:sizeof这个函数的用法,你真的懂吗,不见得吧。上一段代码看一下就知道了: 1 #include <iostream> 2 using namespace std; 3 4 void Founc(char str1[100]) 5 { 6 cout<<sizeof(str1)<<endl; 7 } 8 9 int main( void )10 {11 char str[] = "hello";12 char ch[100]="world";13 char *p = str;14 int n=10;15 cout<
阅读全文
摘要:函数指针:顾名思义就是函数的指针,由函数修饰,说明这是一个指向函数的指针。函数指针的应用:可以通过函数指针变量方便的调用功能不同的函数。上代码:代码一: 1 #include <iostream> 2 using namespace std; 3 4 void Func1(int); 5 void Func2(int); 6 void Func3(int); 7 typedef void (*FuncType)(int);//定义函数指针类型 8 void CallFunc(FuncType fc, int); 9 10 11 int main(void)12 {13 CallFu
阅读全文
摘要:c++中比较常用的一种类型是字符串类型,平常都是调用"string.h" 头文件或类库,这里简单的进行自定义。首先编写String类,创建头文件String.h:String.h 1 #include 2 using namespace std; 3 4 class String 5 { 6 public: 7 String(const char *str = NULL); 8 String(const String &other); 9 ~String(void);10 String & operator =(const String &other
阅读全文
摘要:# 成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无.-- 只能靠参数而不能靠返回值类型的不同来区分重载函数.-- 并不是两个名字相同的函数就能构成函数重载,得具有相同的作用域.**重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。# 覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字.**覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚
阅读全文

浙公网安备 33010602011771号