c++学习笔记.docx
《c++学习笔记.docx》由会员分享,可在线阅读,更多相关《c++学习笔记.docx(15页珍藏版)》请在冰点文库上搜索。
c++学习笔记
针对vs的一些问题
1、VS2013中使用fopen、sprintf等函数是会出现安全问题:
errorC4996:
'fopen':
Thisfunctionorvariablemaybeunsafe.Considerusingfopen_sinstead.Todisabledeprecation,use_CRT_SECURE_NO_WARNINGS.Seeonlinehelpfordetails.
而报错。
解决方法:
右键工程名-->属性-->C/C++-->预处理器-->预处理器定义,编辑右边输入框加入:
_CRT_SECURE_NO_WARNINGS
保存。
2、不能从constchar*转换为LPCWSTR
在VC6.0中编译成功的项目在VS2005vs2005、vs2008、vs2010中常会出现类型错误。
经常出现的错误是:
不能从constchar*转换为LPCWSTR
如使用MessageBox(hwnd,"TEST",NULL,0)就会报错,如果使用强制转换(LPCWSTR)"TEST",虽然能够通过,但是编码会出错。
可行的办法是使用_T("TEST")转换,或者TEXT("TEST")都可以
MessageBox(hwnd,TEXT("TEST"),NULL,0);
MessageBox(hwnd,_T("TEST"),NULL,0);
或者强制使用ANSI字符MessageBoxA(hwnd,"TEST",NULL,0);
另一种方法是:
项目菜单——项目属性(最后一个)——配置属性——常规——项目默认值——字符集,将使用Unicode字符集改为未设置即可。
3、设置当前操作的项目为默认启动项
右击解决方案-》通用属性–》启动项目-》当前选定内容。
4、在vs2013中出现错误:
未定义标识符ULONG_PTR,BOOL,DWORD,LPCTSTR,HWND等
在文件头部增加:
include头文件WinDef.heg:
#include
5、vs2012下用MFC编程,用CString定义一个对象,m_strLine,希望实现在onChar消息下实现键盘输入一个字符串,就把它加入到m_strLine中,写如下代码
m_strLine+=nChar;会报错;运算符与操作数类型不匹配
因为nChar是UNIT类型的,而m_strLine是CString类型的,不同类型的不能进行加减、赋值等操作,需要改成
m_strLine+=(char)nChar;
6、vs2012删除某个成员函数(不是物理删除就是注释掉而已)
右键点击该成员函数所属的类,选择类向导,在弹出的对话框中选中该成员函数,点击删除处理程序即可达到在成员函数的前面添加注释的效果;
Vs快捷键
Ctrl+K,C:
注释选定内容
Ctrl+K,U:
取消选定注释内容
Ctrl+左右箭头键:
一次可以移动一个单词
Ctrl+上下箭头键:
滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L:
删除当前行
Ctrl+E,W:
自动换行
Ctrl+G:
转到指定行
Shift+Alt+箭头键:
选择矩形文本
Alt+鼠标左按钮:
选择矩形文本
Ctrl+Shift+U:
全部变为大写
Ctrl+U:
全部变为小写
Ctrl+D,B:
断点窗口
Ctrl+D,I:
即时窗口
Ctrl+Shift+N:
新建项目
Ctrl+Shift+O:
打开项目
Ctrl+Shift+S:
全部保存
Shift+Alt+C:
新建类
Ctrl+Shift+A:
新建项
Shift+Alt+Enter:
切换全屏编辑
智能提示:
ctrl+J
方法参数提示:
ctrl+shift+空格
Ctrl+F5:
开始执行(不调试)
F9:
切换断点
Ctrl+Shift+F9:
删除全部断点
关闭VS2013中单击打开文件的功能
中文版:
工具--》选项--》环境--》选项卡和窗口--》预览选项卡
去掉“在解决方案资源管理器中预览选定的文件(在按住Alt的同时单击可避免预览)(X)”的勾选
C++中的模板
类模板
1、先建立一个Arry.h的头文件
2、在头文件中写入固定格式
#ifndefARRY_H
#defineARRY_H
…code…
#endif
3、在上一步的code地方创建类模板
template
classArray
{
public:
Array(intsize);//构造函数
boolpush(Telem);//放入值
voiddisplay();//显示函数
private:
T*m_pArr;
intm_iSize;
intm_iLength;
};
4、实现构造函数Array();
template
Array:
:
Array(intsize)
{
m_iSize=size;
m_iLength=0;
m_pArr=newT[m_iSize];
}
5、实现成员方法push();
template
boolArray:
:
push(Telem)
{
if(m_iLength>=m_iSize)
{
returnfalse;
}
m_pArr[m_iLength]=elem;
m_iLength++;
returntrue;
}
6、实现成员方法display();
template
voidArray:
:
display()
{
for(inti=0;i{
cout<}
}
7、创建实例化的主函数入口文件
#include
#include"Arry.h"
#include
usingnamespacestd;
intmain(void)
{
Arrayarr1(10);
arr1.push
(2);
arr1.push(4);
arr1.display();
Array*arr2=newArray(10);
arr2->push(5);
arr2->push(6);
arr2->display();
system("pause");
return0;
}
C与C++的区别
主要内容:
C与C++的简单区别:
1、建立的文件类型不一样,c语言为.c,c++为.cpp;;
2、引入的头文件不一样;
3、C++有命名空间;
4、输入输出语句不一样;
5、C语言不允许重载,C++可以重载;
6、自定义类型,c语言使用struct,c++使用class;
7、C语言面向过程,c++面向对象;
C++特性
抽象具体事务的定义过程
封装讲操作方法与数据绑定在一起
继承支持单继承、也支持多继承
多态
当c++编译器在编译的时候,发现animal类的breath()函数是虚函数,这个时候c++就会采用迟绑定技术(latebinding)的技术,在运行时,依据对象的类型来确认调用的是哪一个函数,这种能力就叫做c++的多态性;
C++中无访问限定符的时候默认为private
Php中无访问限定符的时候默认为public
结构体中无访问限定符默认为public
这又是结构体与类的不同之处
编写潜规则:
先写private私有数据成员
后写public方法
#include
usingnamespacestd;
structStudent{
inta;
doubleb;
charc;
voidSetData(intxa,doublexb,charxc){
a=xa;
b=xb;
c=xc;
}
};
classCGoods
{
public:
voidRegisterGoods(char[],int,float);//输入数据;
voidCountTotal(void);//计算商品的总价值;
voidGetName(char[]);//读取商品名;
intGetAmount(void);//读取商品数量;
floatGetTotal_Value(void);//读取商品单价;
public:
//访问限定符
charName[21];
intAmount;
floatPrice;
floatTotal_value;
};
C++语言中,函数的参数和返回值的传递方式有三种:
值传递、指针传递和引用传递。
1、以下是“值传递”的示例程序。
由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n,所以n的值仍然是0。
Voidfunc1(intx)
{
X=x+10;
}
Intn=0;
Func1(n);
Cout<<”n=”<2、以下是“指针传递”的示例程序。
由于Func2函数体内的x是指向外部变量n的指
针,改变该指针的内容将导致n的值改变,所以n的值成为10。
Voidfunc2(int*x)
{
(*x)=(*x)+10;
}
Intn=0;
Func2(&n);
Cout<<”n=”<3、以下是“引用传递”的示例程序。
由于Func3函数体内的x是外部变量n的引用,x
和n是同一个东西,改变x等于改变n,所以n的值成为10。
voidFunc3(int&x)
{
x=x+10;
}
⋯
intn=0;
Func3(n);
cout<<“n=”<对比上述三个实例程序,会发现“引用传递”的性质像“指针传递”,而书写方式像“值传递”。
实际上“引用”所能够做的任何事情“指针”也都能够做。
数据类型
数据类型的本质:
固定大小内存块的别名
B&b数组数据类型,(定义一个:
1、数组类型,2、数组指针,3、数组类型和数组指针类型的关系)
this关键字
构造函数与析构函数
一、构造函数是特殊的共有成员函数,其特征如下:
1、函数名与类名一致
2、构造函数无函数返回类型说明,注意是没有而不是void,即什么也不写,也不能写void!
!
实际上构造函数有返回值,返回值就是构造函数创建的对象。
3、在程序运行时,当新的对象被建立,该对象所属的类的构造函数被自动调用,在该对象的生存期中也只调用一次。
4、构造函数可以重载,严格的讲说明中可以有多个构造函数,他们由不同的参数表区分,系统自动调用时按一般函数重载的规则进行选择执行。
5、构造函数可以在类中定义也可以在类外定义
6、如果类说明中没有给出构造函数,则C++编译器会自动给出一个带缺省参数的构造函数
类名(void){}
但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数,
只要构造函数是无参的或者只要各参数均有缺省值的,C++编译器都会认为是缺省的构造函数,并且缺省的构造函数只能有一个。
如果对象的数据成员全是共有的,也可以在对象名后面加“=”加“{}”
7、构造函数的执行顺序先父类后子类
8、析构函数的执行顺序先子类后父类
指针学习
1、指针理解
double*tax_ptr;
char*str;
//虽然tax_ptr和str指向两种不同长度的数据类型,但是变量本身的长度是相同的,也就是说,char的地址与double的地址是相同的。
地址的长度或值既不能指示关于变量的长度或类型的任何信息,也不能指示改地址上有什么建筑物。
一般来说,地址需要两个还是四个字节,取决于计算机操作系统。
2、指针的危险
C++创建指针时,计算机将分配存储地址的内存,但不会分配用来存储指针所指向的数据的内存。
指针变变量不能赋一个变量进去。
也就是说不能简单的将整数赋值给一个指针变量。
指针不是整形,虽然计算通常把地址当作整数来处理,从概念上看,指针与整数是两个截然不同的概念,整数可以运算,而指针仅仅描述的是位置,两个地址相乘没有任何意义。
3、变量是编译时分配的有名称的内存,而指针只是为可以通过名称访问的内存提供了一个别名。
指针的真正用武之地在于,在运行阶段分配未命名的内存以存储值,在这种情况下只能通过指针来访问。
4、new运算符
New将找到一块长度正确的内存块,并返回该内存块的地址。
程序员要做的是将该地址赋给一个指针。
5、为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的格式:
typeName*pointer_name=newtypeName;
需要在两个地方指定数据类型:
(1)、用来指定需要什么样的内存;
(2)、用来声明合适的指针;
6、基本类型变量的值都被存储在栈(stack)内存区域中,而new从堆(heap)或自由存储区(freestore)的内存区域分配内存。
7、为数组分配内存的通用格式:
Type_name*pointer_name=newtype_name[num_elements];
虚函数
VirtualvoidBreath()=0;//加个virtual函数名=0;就为纯虚函数,纯虚函数没有函数体
含有纯虚函数的类称为抽象类
C++菜单项中同时增加的命令响应函数他们之间的执行传递顺序为
Viewclass->DocClass->MainFrame->AppClass
制作右键菜单
添加事件处理函数
创建系统默认的菜单:
MFC非模态对话框的创建
1、用MFC创建非模态的对话框,和模态对话框创建方式不同,模态对话框用dlg.DoModel()调用,而非模态对话框要用create函数创建调用。
2、IDD_TEST_DLG为已经定义的对话框资源的ID号
CTestDlg*dlg=newCTestDlg;
dlg->Create(IDD_TEST_DLG,NULL);
dlg->ShowWindows(SW_SHOW);//SW_SHOW是对话框的显示方式
3、建立:
//主框架中,即调用/创建非模态对话框的对话框/窗体:
CTestDlg*pDlg=newCTestDlg;
pDlg->Create(IDD_TESTDLG,this);
pDlg->ShowWindow(SW_SHOW);
//非模态对话框中