vc++笔记 基础

1.c++程序
   在编译和运行时不会对数组进行越界检查。
2.指针
  指针就是地址,用于存放内存地址的变量。有相应的数据类型。如,int *pointer或int* pointer
  & 取地址运算符  ,* 指针运算符。
  &用于取出变量的地址,* 以指针作为其操作数据,其运算结果表示所指的变量
  & 和 * 互为反运算
3.数组
  a[]="hello" 字符数组的长度为6,字符串长度为5.
4.转义字符.
  /对后面的特殊字符,进行还原. 如/" 得到".
5.字符串
  char *str="this is a test";
6.结构定义
定义时不能初始化
 特殊的数据类型
 struct struct_name{
 datatype membername;
};
struct_name var_name;
引用成员 . 和->
7.枚举类型
定义: enum enum_name{member1,member2=3,member3}
使用: enum_name var_name=member1;
8.typedef定义
typedef 数据类型,新的类型名
typedef int INTEGER;
9.switch
  在switch 中,表达式与常量的类型必须一致,且只能是字符型,整型,枚举型
10. 函数
 函数的默认类型为int,若不返回值则用void
函数不充许嵌套
参数传递: 值,(单向)按地址(双向),引用(双向)
函数原型
如void swap(int*,int*);
void swap(int* px,int* py)    
调用外部函数 [extern] int yourfun(int,int)   通常,可将所有外部函数的声明放在一个头文件中,然后用#include指令包头文件.
void myfun(int val=10);当有多个缺省的值时,须放在右边。即(myfun(int w,int y=1,int x=2) )
myfun();如果函数调用,省略实参数,则把缺省的值10传递给形参。//等同于myfun(10)
调用函数时,如果省略了某个实参,则其右边的都得省略。
内联函数,即在函数头前加上inline,当调用时,将函数体替换为调用语句。因此这样内存开销很大。
inline int sum(int x){}
11.引用
数据类型  &引用名 = 变量名
如 int  Actuallint=10;
int &otherint=actualint;
otherint++;  //同时执行actualint++
actualint=70 ;//同时执行 otherint=70
引用最在用处是函数调用
原型声明 void swap(int&,int&);
void swap (int& x, int& y){}
12.使用作用域限定符::来标识同名的全局变量
13.动态分配内存
new
p = new type[size]  type 数据类型  size表示要为多少个变量分配空间,省略size为1;p 是一个type类型的指针变量,指向所分配的存储单元
如 int* pNum=new int[12]

delete
delete用于释放new分配的内存空间 delete p;
如果要释放一个动态数组所占用的内存空间,采用如下形式:delete []pa;

14.编译预处理
#include 文件包含指令  #include <文件名> #include "文件名"  两者有区别
#define  宏定义指令   #define <宏名> <宏体>       宏体是任意字符序列  #define MAX
#define (宏名) (参数1,...)  #undef <宏名>
条件编译指令 以 #if #ifdef #ifndef 开始  最后以#endif结束
#if ... [#else] ... #endif
#ifdef ... [#else] ... #endif
#ifdef ... [#else] ... #endif

15类的函数实现
 returndatatype classname :: functionName().....
16. 编码约定
类的定义放在头文件中(.h)
类的实现放在源文件中(.cpp)
main函数放在另一文件中,可用#include 编译预处理指令包含头文件.
17.对象声明
objectname obj1,obj2;
point *pt1=&obj1;
18.对象成员的访问
.   ->  来访问非私有成员
19.构造函数和析构函数
构造函数:是创建对象时,(声明或new动态创建)系统自动调用的成员函数。和类名相同 如,classname
析构函数:是在对象生存结束是系统自动调用的成员函数。必须在类名前加上~  如,~classname
他们都没有返回值。
他们的实现跟一般函数相同。
自动调用:classname objname(...) 在main函数中自动调用
  当退出main()主函数时自动调用析构函数
析构函数的调用与构造函数的调用顺序相反。
栈:后进先出表。
20.this的用法。
指当前对象
调用对对象成员方法时,编译器会将对象的地址赋值给this指针,并将该地址值加入到参数列表中.如,EndTime.showTime(&EndTime);

display(this); //以this指针作为参数
21静态成员的声明
public:
        static int m_ncount;
初始化放在类定义的外部
int person :: m_nCount=0;
为类的所有对象共享,只有一份,存储在同一个内存空间
22.静态成员变量的访问。
对象访问。person1.m_ncount=100
类名和作用域限定符(::)int person:: m_nCount=100
在成员函数中访问 m_nCount++;
私有和保护静态成员:只能在成员函数中访问
23.静态成员函数
静态成员没有this指针,
可能通过对象,类名,作用域限定符,在成员函数中来调用静态成员函数。
静态成员函数,只能访问静态成员。不过可以通过将对象作为静态成员函数的参数,然后在成员函数中通过对象访问它的非静态成员。static long getid(person)
24.友元函数
不是类的成员函数,可以访问类所有成员包括私有成员和保护成员。
声明: friend void display(a);
friend void B::BMemberFun(A&);//另一个类B成员函数
25.派生类的定义
class 〈派生类名> :【派生方式】 <基类名>{...}
派生方式: pulic private protected (缺省为private)
public: 保持不变  派生类的成员函数可以访问基类非私有成员(包括protected,public),派生类的对象可以访问基类的公有成员
private:都成为私有的,只充许在派生类的成员函数中访问基类的非私有成员。private 很少用
protected 保护的和公有的成为保护成员,只允许在派生类成员函数访问非私有成员
private:  都是私有的
26.显式方式的构造函数的定义
类B是类A的派生类
B::(<...>):A(...){}
27多重继承
用逗号隔开
28.多重继承的二义性问题
 使用作用域限定符(::)
 如,d d1;
d1.B::a=100;
d1.c::a=100;
29虚基类方式定义派生类
即一个基类,为所有派生类共享。只存在一个派生类。
定义派生类的方法:是在基类的前面加上关键字virtual,而基类的定义与一般的完全一样。
如,class b:virtual public a
30.多态性
编译时多态性:重载 
运行时多态性:虚函数
31.用基类指针指向派生类对象
声明一个派生类对象同时也声明了一个基类对象
派生类的对象可以认为是其基类的对象。C++允许一个基类对象的指针指向其派生类的对象。
不允许派生类对象的指针指向其基类的对象。
即使将一个基类对象的指针指向其派生类的对象,通过该指针也只能访问派生类中从基类继承的公有成员,不能访问派生类自定义的成员,除非通过强制类型转换将基类指针转换为派生类指针。
32.虚函数的声明
要将一个成员函数声明为虚函数,只需在定义基类时在成员函数声明的开始的位置加上关键字virtual.
如,class A
{ public:
 virtual void show (){};
};
当重载时,基类指针,指向的派生的对象,调用的成员函数将是派生类的,这与没重载时相反。
33.联编
重载:静态多态性或编译时多态性
虚函数:动态多态性或运行时多态性
34. 构造函数、析构函数、虚函数
基于构造函数的特点,不能将构造函数定义为虚函数
 如果使用虚析构函数,无论是指针所指的对象是基类对象还是派生类对象,程序执行时都会调用对应的析构函数。
25.抽象类
用于继承,提供统一的接口,框架,由派生类实现。可以声明指向抽象类的指针
定义:至少有一个成员函数没有实现(也叫纯虚函数)
      定义了一个protected属性的构造函数或析构函数
26纯虚函数
不定义具体的实现的成员函数,不能被调用,仅提供统一的接口。
声明:virtual <数据类型> <成员函数> (形参表)=0;
只有重新定义基类中的所有纯虚函数,该派生类才不会成为抽象类。
26。函数重载(只对参数而言的)
定义:指一组功能类同但函数参数类型(个数)不同的函数可以共用一个函数名
不能利用返回类型,引用来进行函数重载。
构造函数的重载
27.
运算符重载:指结于不同数据类型的操作数,同一个运算符所代表的运算功能可不同。
重载运算符的形式:编写一个运算符函数,重载运算(函数)的原型为:
<数据类型》 operator <运算符>(<形参表>)
利用普通函数重载运算符。或成员函数重载
28.模板
定义:不指定某些参数的数据类型的函数,在函数模板被调用时根据实际参数的类型决定template <class t>  //t 用定义函数的参数和返回值,在函数体中用来声明变量。多个类型参数有逗号隔开。如,template <class t1,class t2,class t3>
T abs(T val)
{}

template <class t1,class t2>
t1 max(t1 x, t2 y){
return ....
}
只能定义非成员函数
定这些函数模板参数的类型。
将数据类型参数化
分为:函数模板和类模板
参数据的数据项类型不确定。
提高了软件的重用性
实例化由编译器完成
30.类模板
是对类的抽象。
用来生成多个功能相同而某些数据成员的类型不同或成员函数的参数及返回值的类型不同的类。
定义:
template <class T>
class Mytempclass{
private:
 T x;
public :
 void setX(T a){};
 t getX(){};
};

如查模板类外定义了模板类的成员函数,那须采用如下形式:
template <class t>
void myTemclass<t> :: setX(t a)
{x=a;
}
实例化由编译器完成
通过声明对象时所给出的实际数据类型确定参数。如,mytemclass <int> intObject;
编译器先替代T为int,生成一个类,然后创建intObject

多个参数的类模板的定义:template <class t1, int i, class t2>
声明:mytemclass <int,100,float> myobject
31.
运行时类型识别
dynamic_cast运算符检查一个基类指针是否向其派生类对象;dynamic_cast <type-id>(exp)   //type-id派生类对象指针    exp基类指针

typeid运算符标识指针所指类型  typid(1)=typeid(int)
32.命名规范
采用前缀
n  整表
lp 指针
C 类
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值