学习笔记
qq_35751236
这个作者很懒,什么都没留下…
展开
-
c++中endl、"\n"和'\n'的区别
//c++中endl、"\n"和'\n'的区别//三者都起到换行的作用//endl:除了换行之外,还调用flush函数--刷新缓冲区//即cout << endl == "\n" == '\n';#include<iostream>int main(){ std::cout << "李晓洁" << std::endl; std::cout << "周田心" << "\n" <原创 2017-04-10 09:24:40 · 349 阅读 · 0 评论 -
数组
!!attention!!char chs[] = {'c' , 'j','k'};//长度为3char chs2[] = {'c' , 'j','k' , '\0'};//手动加空字符char chs3[] = "cjk";//默认加空字符,长度为4;//char chs4[4] = "dddd";//错误,长度不够char chs4[4] = "ddd";//错误,长度不够复杂的数组声明原创 2017-04-12 21:45:16 · 131 阅读 · 0 评论 -
含有可变形参的函数
有时我们无法提前预知应该向函数传递几个参数。 如果所有的实参类型相同: initializer_list ini;//是一种模板类型,类似于vector 如果实参类型不同:???void fun7(initializer_list<string> ss){ for (auto s = ss.begin(); s != ss.end(); ++s){ cout << *原创 2017-04-14 15:20:48 · 334 阅读 · 0 评论 -
一点点 一点点 一点点
在c++中建议使用引用代替指针使用应用避免拷贝在函数无需修改引用形参的值时,最好声明为常量引用如果形参是引用类型,则将其绑定到实参上,否则执行拷贝并赋值自增优先级高于解引用,点运算优先级高于解引用拷贝构造和赋值运算 -初次定义为拷贝构造。。。已经定义的变量为赋值原创 2017-04-14 10:51:38 · 227 阅读 · 0 评论 -
构造函数
合成的默认构造函数:编译器创建的构造函数 合成的默认构造函数的局限性:编译器只有在发现类中不包含构造函数时,才会生成默认的构造函数默认数组和指针,即未定义行为有的时候编译器不能为某些类合成默认的构造函数。例如,如果类中包含一个其他类型的成员,且该成员的类型没有默认构造函数,此时,编译器无法初始化该成员。一、内置类型 如int, char, float, unsigned等。内置类型是最原创 2017-04-18 19:20:25 · 156 阅读 · 0 评论 -
拷贝、赋值和析构
对象的拷贝: 初始化变量 以值的方式传递或者返回一个对象赋值:Person p1("li",12);Person p2;p2 = p1;//赋值//**实际操作为:**p2.name = p1.name;p2.age = p2.age;析构:一个局部对象在创建它的块结束时被销毁合成的拷贝赋值和析构函数局限性: 如果类包含vector或者string成员,则其拷贝、赋值和销毁的合成版可原创 2017-04-18 20:27:00 · 313 阅读 · 0 评论 -
c++中struct和class的区别
默认访问权限不一样类成员的默认权限依赖于类定义的方式 默认为private struct 默认为public原创 2017-04-18 20:34:45 · 151 阅读 · 0 评论 -
友元
友元可以是函数,也可以是类 友元函数声明在类定义的内部,位置不限,不受所在区域访问权限的限制 友元可以访问类的私有成员 例如:class Person{ friend istream &read(istream &is, Person &p);private: string name; string address;public: Person(string原创 2017-04-18 20:43:57 · 169 阅读 · 0 评论 -
内联函数
基本思想:将每个函数调用以它的代码体来替换,很可能会增加整个目标代码的体积inline关键字必须和函数体定义放在一起才可以实现内联原创 2017-04-18 21:23:35 · 134 阅读 · 0 评论 -
类数据成员的初始化
在“内联函数”小节中,我们介绍了Screen类,其中成员变量有 窗口宽:width 窗口高:height 鼠标位置:cursor 窗口内容:contents以及成员函数: 默认构造函数 Screen() 带参构造 获取固定位置值 get() 设置固定位置值 set() 移动鼠标位置 mov() 显示窗口内容 display()接下来,我们将定义一个窗口管理类并用它小时显示器上的一原创 2017-04-19 11:05:01 · 356 阅读 · 0 评论 -
两个类的相互引用
例如: A.h class A{ B b; }B.h class B{ A a; }此时若分别互相包含A.h和B.h,则会出错,修改方案为: 一个使用#include “A.h” 另一个使用 类的声明: class B;例://B.h#include "A.h"class B{A a;//对A的操作};//A.hclass B;//类声明class A{B b;/原创 2017-04-19 14:01:16 · 1232 阅读 · 0 评论 -
预处理器 preprocessor
预处理器是在编译之前执行的一段程序,主要包括一下三种形式: (1)宏定义 #define (2)文件包含 #include:当预处理器看到#include标记时,就会用指定的头文件的内容代替#include,在编译时,就对已经替换的文件进行编译 (3)条件编译 #define 指令把一个名字设定为预处理变量,#ifdef 当且仅当变量已定义时为真, #ifndef当且仅当变量未定义时为真。原创 2017-04-20 14:16:51 · 833 阅读 · 0 评论 -
必须使用初始化列表的情况
常量成员,因为常量成员只能初始化不能赋值,所以必须放在初始化列表里面引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。例:class Student{const int a;Student(){a = 1;//错误,实际上是赋值,即在已经定义了a的转载 2017-04-20 15:57:59 · 303 阅读 · 0 评论 -
静态成员可以是不完全类型
class Student{ static Student s; //Student ss;//错误,不允许使用不完整类型 Student *sss;//不完整类型可以是指针或引用 Student &ssss;};原创 2017-04-20 20:07:30 · 581 阅读 · 0 评论 -
位运算
位运算实现求平均值:(x^y)>>1//求不同位的一半 (x&y)//求相同值位的一半 (x&y)+(x^y)>>1 位运算实现求两个值得和int add(int x, int y){ if (y == 0) return x; int yy = (x&y) << 1;//带进位的加法 int xx = (x^y);//不带进位加法 return原创 2017-08-20 11:17:19 · 185 阅读 · 0 评论 -
自定义对象的写入和读出函数
istream &read(istream &is, Person &p){//写入 is >> p.name>>p.address; return is;}ostream &print(ostream &os, const Person &p){//读取 os << p.getName() << "+" << p.getAddress(); os << endl原创 2017-04-18 16:44:28 · 214 阅读 · 0 评论 -
引用
引用(reference):对象的另一个名字,指向的是同一个内存单元,必须初始化 int x = 10; int &y = x;//x和y的地址一样 int z= 12; y = z;//x = 12 =y = z;可是x和y的地址不变引用即别名,定义了一个引用之后,对其进行的所有操作都是在与之绑定的对象**上进行的。int *p = &x;//定义指针变量p int &xx = *p;/原创 2017-04-10 16:14:09 · 236 阅读 · 0 评论 -
const 限定符 extern 对常量的引用 指向常量的指针 常量指针
main.cppextern const int x = 10;//必须加externint main(){return 0;}fun.cppextern const int x;void fun(){cout<<x<<endl;//可以使用x;}2. 对于非const变量而言 main.cppint x = 10;//必须是全局变量int main(){return 0;}原创 2017-04-10 20:25:56 · 402 阅读 · 0 评论 -
c++从键盘输入文件结束符
//从键盘输入文件结束符#include<string>#include<iostream>using namespace std;string ss; while(cin >> ss){ cout << ss << endl; }键盘输入:li xiao jie Enter 显示: li xiao jie 再输入 ^Z(ctrl+z得到) 即可结束原创 2017-04-10 10:20:52 · 611 阅读 · 0 评论 -
符号转型
unsigned a = 1; int b = -1; a * b = 2^(32)-1; //由有符号数转换为带符号的整数-1的的补码形式为:1111 1111 1111 1111 1111 1111 1111 1111 原码:1000 0000 0000 0000 0000 0000 0000 0001原创 2017-04-10 11:40:21 · 168 阅读 · 0 评论 -
列表初始化
初始化 != 赋值 初始化:创建变量时,为变量赋予初始值 赋值:将对象当前值擦除,并用一个新值来代替列表初始化:无论是初始化对象还是某些时候为对象赋新值,都可以使用一组由花括号括起来的初始值 int x = 0; int x = {0}; int x{0}; int x(0);原创 2017-04-10 14:50:01 · 170 阅读 · 0 评论 -
文章标题
cctype.hisalnum(c);//当c为字母或数字时为真isalpha(c);//当c为字母时为真iscntrl(c);//当c为控制字符时为真isdigit(c);//当c为数字时为真isgraph(c);//当c不是空格但可打印时为真islower(c);//当c是小写字母时为真isprint(c);//当c是可打印字符时为真ispunct(c);//当c是标点符号时为真原创 2017-04-12 11:41:34 · 136 阅读 · 0 评论 -
string
字符串:初始化 string s; string s1 = "lixiaojie"; string s2(s1); string s3 = s1;//等价于s3(s1) string s4(5, 'c'); string &s5 = s1; cout << "length="<<s1.length()<<" size="<<s1.size()原创 2017-04-12 11:24:42 · 271 阅读 · 0 评论 -
vector
vector是类模板: 类模板:通过提供一些额外信息来指定模板到底实例化成什么样的类vector<int> ivec;//保存int 类型的对象vector 能容纳大多数类型的对象作为其元素,但是因为引用不是对象,所以不存在包含引用的vector。早期以vector作为元素的表示方式为:vector<vector<int>>定义和初始化 vector<int> v1;//默认初始化,v1原创 2017-04-12 17:05:23 · 212 阅读 · 0 评论 -
迭代器iterator
用于访问容器和string中的元素:间接访问it = s.begin();//it是个指针,指向s的第一个元素it = s.end();//it指向s最后一个元素的下一个位置for(auto it = s.begin(); it != s.end() ; ++it){//检查是否为空*it = 'v';}vector::iterator it;//it 能读写vector的元素 strin原创 2017-04-12 17:27:31 · 154 阅读 · 0 评论 -
c标准下的字符串
c++支持c风格的字符串,可是最好不要使用c风格字符串:试讲字符串存放到数组中,并以空字符结束#include<string.h>char chs[] = "string";//默认以空字符结束,strlen(chs);//遇到空字符结束,否则结果错误strcmp(ch1 , ch2);//比较两个字符串的大小//必须要由调用者计算ch1的大小strcat(ch1 ,ch2);//将ch2附原创 2017-04-13 10:00:43 · 289 阅读 · 0 评论 -
运算优先级问题
int i = f1() * f2();//f1()和f2()肯定会在乘号之前执行,可是我们并不知道先执行的是哪个cout<<i<<i++;//此时,并不知道先执行i++和是i 即称该表达式的行为是不可预知的只有四种运算符明确规定了运算对象的求值顺序 && || ?: 和 , (先左后右)求值顺序、优先级、结合律int i = f() + f1() * f2();//优先级规定:f1()和原创 2017-04-13 15:29:38 · 312 阅读 · 0 评论 -
默认初始化
全局变量会初始化,局部变量不会默认初始化例:int i;//默认初始化为0;类对象会通过默认构造方法进行默认初始化string s;//nullvector<int> vec(10);//0 0 0 0 0 0 0 0 0 0 编译器可以跳过定义,跳不过初始化int b = 3; switch (b){ case 0: //string s;//错误,s默认隐式初原创 2017-04-14 08:50:40 · 219 阅读 · 0 评论 -
do...while
实例:不断提示用户输入一对数,然后求其和string rsp; do{ cout << "please enter two numbers:" << endl; int val1,val2; cin >> val1 >> val2; cout << "the sum of " << val1 << "and " << val2原创 2017-04-14 09:20:28 · 116 阅读 · 0 评论 -
常量成员函数
C++语言允许把const关键字放在成员函数的列表之后,此时,紧跟在参数列表后面的const表示 this 是一个指向常量的指针。像这样使用const的成员函数被称作常成员函数原创 2017-04-18 15:41:29 · 166 阅读 · 0 评论 -
异常处理机制
异常处理机制包括 异常检测 和 异常处理 异常检测部分:throw expression 异常处理部分:try{try block}catch try抛出异常 catch处理异常原创 2017-04-14 09:55:01 · 230 阅读 · 0 评论 -
局部对象
形参和函数体内部定义的变量统称为局部变量 自动对象:达到定义所在的块末尾时,被销毁的对象 为自动对象 局部静态对象:在程序的执行路径第一次经过对象定义语句时初始化,并且知道程序种植才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响原创 2017-04-14 10:39:33 · 227 阅读 · 0 评论 -
文章标题
1. this指针,在成员函数的开始前构造,在成员函数结束后清除 例如:class A{ int fun(int p);//等价于 int fun(A * const this, int p); }2. C语言中struct没有构造函数 c++中struct有构造函数,只是成员变量的默认属性为private,C++中struct的唯一意义是让C语言有个归属感。3. Test b原创 2017-09-14 11:43:08 · 188 阅读 · 0 评论