文章目录
CC++ 学习笔记
VS
解决VS控制台窗口自动关闭的问题
在代码结束或返回前加一句话:
system("pause");
需要头文件:#include<stdlib.h>
VS 快捷键
- F5 : 继续运行,如果后面有断点则在断点处停止
- F9 : 在光标所在行增加一个断点
- 逐过程 F10,逐语句执行 F11,会进入函数内部 ,shift + F11 跳出函数内部
- Ctrl+F10 : 运行至光标处
- 注释选中行Ctrl+K,C 或Ctrl+E,C , 取消注释行Ctrl+K,U 或者Ctrl+E,U
- 转到定义 F12
- 删除当前行 Ctrl+Shift+L , Ctrl + L
- 折叠到定义 Ctrl+M,O
- 全变为大写:Ctrl+Shift+U 全变为小写Ctrl+U
- 查看方法参数信息Ctrl+Shift+空格
- 转到行号 Ctrl+G
- 全屏切换Shift+Alt+Enter,向后导航Ctrl±,向前导航Ctrl+Shift±
- VS2010,VS2012,VS2015等的自动提示不能默认选中的功能解决办法
只需要按 ctrl+alt+space 即可切换。
C 中数组作为函数的参数和返回值
- 作为参数
博客
void myFunction(int *param){} void myFunction(int param[10]) void myFunction(int param[])
- 作为返回值
C语言编程不允许返回整个数组作为参数传递给函数,一般让函数返回数组的指针或引用实现.
int *relation(int* refer_arry,int* signal_arry,int L,int M) { int i;//refer_arry->i //int j=0;//signal-arry->j int k;//result->k int result[10]={0}; for(k=0;k<L;k++) { for(i=0;i<L;i++) { result[k]=result[k]+refer_arry[i]*signal_arry[i-k+L-1]; } } return result; }
指针
- 指针是存放内存地址的变量
字符串
/*
例如,提示及用户输入如下:
请输入数据, 以空格分开: 12 15 98 (回车)
注:用户输入时中间可能是一个空格,也可能是多个空格,不影响结果。
input: 输入的字符串
numbers: 输出参数,存放解析出来的数,此缓冲区要求足够大
返回值: 解析出来的个数
1 int parse(const char* input, int numbers[] ); 2 */ 3 int parse(const char* input, int numbers[] ) 4 { 5 int start = 0; 6 int end = 0; 7 int flag = 0;//0 為空格 8 int count = 0; 9 for (int i = 0; ; i++) 10 { 11 char ch = input[i]; 12 if (ch != ' ' && ch != 0) 13 { 14 if (flag == 0) 15 { 16 start = i; 17 flag = 1; 18 } 19 }else 20 { 21 if (flag == 1) 22 { 23 end = i; 24 flag = 0; 25 26 // 得到一个区间 end - start 27 char buf[128] = {0}; 28 //char buf[128]; 29 int len = end - start; 30 //从 input + start 的位置开始 复制 len 个字符到 buf 31 memcpy(buf,input + start ,len); 32 int num = atoi(buf); 33 numbers[count++] = num; 34 } 35 36 } 37 if (ch == 0 ) break; 38 } 39 return count; 40 }
1, 字符串的遍历兩种方式:数组和指针
2, 字符串的复制注意区别浅拷贝和深拷贝
这是浅拷贝,兩个指针指向同一块内存是不合理的
1 char* p1 = "hello world"; 2 char* p2 = p1;
3, 字符串的比较 strcmp函数
4, 字符串的长度 strlen
5, 字符串的插入和删除都是效率低下的还不如直接复制一份新的
6, 学习 string.h 里面的字符串相关操作函数
7, sprintf 格式化字符串函数
sprintf(dst, "%d/%d/%d", year, month, day);
标准C 函数库学习
- 取得当前时间,将当前时间转化为年月日
1 time_t start = time(NULL);//这是一个秒值,不是毫秒值 2 tm info = *localtime(&start); 3 printf("%4d-%02d-%02d %02d:%02d:%02d ",info.tm_year + 1900,info.tm_mon + 1, 4 info.tm_mday,info.tm_hour,info.tm_min,info.tm_sec);
打开浏览器 system("explorer http://afanihao.cn");
- c++中用cout需要添加的头文件
#include <iostream>
using namespace std;
继承
- C++ 中支持多继承,但是这个设计存在缺陷,如果继承的兩个父类中有相同的成员时会出现冲突
- 所谓的纯虚函数纯虚类即java中的抽象函数,抽象类
- 所谓虚拟继承即java中所说的父类引用指向子类对象
- 虚函数 : 当父类与子类中皆存在相同的方法时(这其实就是多态),如同让P调用的是子类中的test呢?
将父类中的函数声明为
virtual
的
1 class Base 2 { 3 public : 4 virtual void Test() 5 { 6 printf("我是父類"); 7 } 8 }; 9 class Child : public Base 10 { 11 public : 12 void Test() 13 { 14 printf("我是子類"); 15 } 16 }; 17 Base* p = new Child; 18 p->Test();
拷贝构造函数
- 通常情况下不需要我们自己添加拷贝构造函数,默认的拷贝构造函数一般是够用的.
extern 与 static 如何声明与定义全局函数与全局变量
模板
模板就是java中的泛型
vector
size : 实际長度
capacity : 容量
其它
输出字符 : printf("%c", a);
打印数组 :
char buf[33]; printf("%s ", buf);
http://www.cnblogs.com/iBinary/
在这里重点提一下unknowncheats, 简称UC. 这是一个关于外挂、逆向等技术的论坛,类似国内的看雪,
VS 快捷键
- 向上插入空行 : Ctrl + enter
- 向下插入空行 :Ctrl + shift + enter
- 快速复制当前行到下一行 :Ctrl + c + v
- 全屏化编辑窗口 : Alt + shift + enter
输入输出
- 在控制台输入字符串并打印出来
char arr[128]; gets_s(arr); printf("%s", arr);
%c 打印单个字符
$s 打印字符串
%d 打印整型
%f,%lf 打印小数和长小数
指定小数点后的位数
%.2f 以小数点后的位数为两位打印
字符串替换
/* 完成函数: int replace( char* src, const char* subtext, const char* newtext); 完成对源字符串src中子串的替换,将subtext出现的地方替换为 newtext 例如, src: " just do it . never give up. " subtext: "just" newtext: "some" 注:源字符串中该子串可能出现多次,需依次替换。 */ void strReplace1(char* strSrc, char* strFind, char* strReplace) { if (strSrc == NULL || strFind == NULL || strReplace == NULL) return; char *replace = strReplace; char *find = strFind; while (*strSrc != ' ') { if (*strSrc == *strFind) { char *begin = strSrc; while (*strSrc != ' ' &&*strFind != ' ' && (*strSrc++ == *strFind++)); if (*strFind == ' ')//查找到strFind字串 { while (*strReplace != ' ' && (*begin++ = *strReplace++)); strReplace = replace; } strFind = find;//指针归位 } else strSrc++; } } int main() { char strSrc[] = "RSTDEFGRSTKLMNOPQRSTUVWRS"; char strFind[] = "RST"; char strReplace[] = "ggg"; strReplace1(strSrc, strFind, strReplace); printf_s("%s ", strSrc); system("pause"); return 0; }
- 使用printf不报警告不报错的方法 :
#define _CRT_SECURE_NO_WARNINGS
C++中的类
C++ 中方法名的首字母是大写的,之后每个单词的首字母也是大写
C++中的访问修问修饰符:
public : 可读可写
private : 不可读不可写
protected :
如何实现成员变更的只读或只写呢?
只设置getter 或只设置setter
C++ 中可以把函数定义在类的外面,甚至不是在同一个cpp文件里面,但是要在类里面先声明这个函数.在类的外面定义时要加下类名限定符
const可以放在函数的后面也可以放在函数的前面
void Test() const{} const void getName(){}
构造函数与析构函数
- C++中的对象只有被初始化才能被称为真正意义上的对象.
-
重载 : 函数名相同,参数列表不同
-
重写 : 函数名相同,参数列表也相同
-
析构函数
- 析构函数从不在函数中显式的调用
- 以~ 开头,和类名相同,没有返回值
- 默认构造函数
- 构造函数无参数或所有的参数都有默认值
- 没有默认构造函数创建数组时会报错
- 有两种对成员变量时行初始化的方法
- 我们常用的方式
- 使用初始化列表,在构造函数的小括号后面,大括号前面,加上一段由 冒号引导,用逗号隔开的初始化列表.
class Circle { public: Circle():x(0), y(0), radius(1) { } private: int x; int y; int radius; };
继承
权限修饰符
public : 可以被外部访问,可以被子类继承
private : 不可以被外部访问,不可以被子类继承
protect : 不可以被外部访问,可以被子类继承