目前在阿里巴巴搬砖
每个类都会定义它自己的作用域。在类的作用域之外,普通的数据和函数成员只能由对象、引用或者指针使用成员访问运算符来访问。对于类类型成员则使用作用域运算符访问。不论哪种情况,跟在运算符之后的名字都必须是对应类的成员: Screen::pos ht=24,wd=80; //使用Screen定义的po...
类的基本特性包括:类型成员、类的成员的类内初始值、可变数据成员、内联成员函数、从成员函数返回*this。 类成员再探 定义一个类型成员 Screen不是显示器中的一个窗口。每个Screen包含一个用于保存Screen内容的string成员和三个string::size_type 类型的成员,它们分别表示光标的位置以及屏幕的高和宽。
在C++语言中,我们使用访问控制说明符加强类的封装性: 定义在public说明符之后的成员在整个程序内可被访问,public成员定义类的接口 定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装了(即隐藏了)类的实现细节。
定义成员函数
当将一个类A的成员函数A::F设置成类B的友元时,需要预先定义类A,否则不能将A::F指定为友元。而在定义B之后,才能定义A::F,因为A::F被设为 友元正是为了访问类B的成员函数。所以,可以按照如下的顺序: 声明类B 定义类A,声明但不实现A::F 定义类B,设置A::F为友元 实现A...
编写函数的声明,令其接受两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。编写4个函数,分别对两个int值执行加、减、乘除运算。 #include #include #include using namespace std; int p...
函数指针 函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。例如: //比较两个string对象的长度 bool lengthCompare(const string&,const string&); 该函数的类型是bool(const string&,const string&).
void f(); void f(int ); void f(int,int); void f(double,double=3.14); f(5.6);//调用void f(double,double) 确定候选函数和可行函数 函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。
1 默认实参 某些函数有这样一些参数,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参。调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。 我们可以为一个或多个形参定义默认值,不过需要注意的是,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。
函数重载 如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数。例如: void print(const char *cp); void print(const int *beg,const int *end); void pring(const int ia[],size_t size); 这些函数接受的形参类型不一样,但是执行的操作非常类似。
#include #include using namespace std; //传入的参数是数组的指针,返回值是数组的指针 string (*fun(string (*s)[10]))[10] { return s; } //using str_arr ...
#include #include using namespace std; //传入的参数是数组的引用,返回值也是数组的引用 string (&fun(string (&s)[10]))[10] { return s; } //using str_arr...
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。return语句有两种形式: return; return expression; 无返回值函数 没有返回值的return语句只能用在返回类型是void的函数中。
一旦程序员把注意力都转向了对象传值方式隐含的效率问题(参见第 20 条)时,许多人都变成了极端的“改革运动者”,他们对传值方法采取斩草除根的态度,在他们不屈不挠追求传递引用方式的纯粹性的同时,他们也犯下了致命的错误:有时候传递的引用所指向的对象并不存在。
一般我们都知道不能返回局部变量的指针,但很多人知道其然,不知道所以然,那么接下来我们分析一下,先看两段代码 /*test1.c*/ #include char* get_str(){ char str[] = {"hello"}; return str;}int main(){ ...
函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本。 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.
当形参是const时,必须要注意关于顶层const的讨论。如前所述,顶层const的作用于对象本身: const int ci=42; //不能改变ci,const是顶层的 int i=ci; //正确:当拷贝ci时,忽略了它的顶层const int *const p=&i; //const是顶层的,不能给p赋值 *p=0; //正确:通过p改变对象的内容是允许的,现在i变成了0 和其他初始化过程一样,当用实参初始化形参时会忽略掉顶层const。
跳转语句中断当前的执行过程,C++语言提供了4中跳转语句:break、continue、goto和return。 break语句 break语句负责终止离他最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。
#include #include #include using namespace std; int main() { vector vec1={0,0,1,1,2,3,5,8}; vector vec2={5,8}; decltype(vec1.
#include #include #include using namespace std; int main() { string maxStr,Str1,Str2; int maxNum,Num1,Num2; if(cin>>Str1) ...
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 何时发生隐式类型转换 在下面这些情况下,编译器会自动地转换运算对象的类型: 在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型 在条件中,非布尔值转换为布尔类型 ...
sizeof运算符返回一条表达式或一个类型名字所占的字节数。sizeof运算符满足右结合律,其所得的值是一个size_t类型的常量表达式。运算符的运算对象有两种形式: sizeof(type) sizeof expr 在第二种形式中,sizeof返回的是表达式结果类型的大小。
赋值运算符的左侧运算对象必须是一个可修改的左值,如果给定 int i=0,j=0,k=0; //初始化而非赋值 const int ci=i; //初始化而非赋值 则下面的赋值语句都是非法的: 1024=k ; //错误:字面值是右值 i+j=k; //错误:算术表达式是右值 ci=k;//错误:ci是常量(不可修改的)左值 赋值运算的结果是它的左侧运算对象,并且是一个左值。
#include #include #include using namespace std; int main() { int ia[3][4]={ {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }; ...
多维数组 严格来说,C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。谨记这一点,对今后理解和使用多维数组大有益处。 使用范围for语句处理多维数组 两层嵌套的for循环来处理多维数组的元素: constexptr size_t rowCnt=3,colCnt=4; in...
尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因。 字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串。
#include #include #include using namespace std; int main() { vector::size_type i=0; int arr[10]={0,1,2,3,4,5,6,7,8,9}; //使用整型...
数组是一种类似于标准库类型vector的数据结构,但是在性能和灵活性的权衡上又与vector有所不同。与vector相似的地方是,数组也是存放类型相同的对象的容器,这些对象本身没有名字,需要通过其所在位置访问。
#include #include #include using namespace std; int main() { vector str={"The is C++ program ","hfh ","","hfdshfisoid"}; for(auto it=str.
我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器。所有标准库容器都可以使用迭代器,但是其中只有少数几种才同时支持下标运算符。
#include #include #include using namespace std; int main() { string word; vector Str; while(cin>>word) Str.
标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。因为vector“容纳着”其他对象,所以它被称为容器。 要想使用vector,必须包含适当的头文件。
#include #include using namespace std; int main() { string str="atfi,,ie,,,idfi,,,oo"; decltype(str.
#include #include using namespace std; int main() { const string hexdigits="0123456789ABCDEF"; cout
标准库类型string 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中。接下来的示例都假定了已包含了下述代码: #include using std::string; 本节描述最常用的string操作。
预处理技术概述 确保头文件多次包含仍能安全工作的常用技术是预处理器,它由C++语言从C语言继承而来。预处理器是在编译之前执行的一段程序,可以部分地改变我们所写的程序。之前已经用到了一项预处理功能#include,当预处理器看到#include 标记时就会用指定的头文件的内容代替#include。
C++11新标准规定,可以为数据成员提供一个类内初始值。创建对象时,类内初始值将用于初始化数据成员。没有初始值的成员将默认初始化。 对类内初始值的限制与之前介绍的类似:或者放在花括号里,或者放在等号右边,记住不能使用圆括号。
有时我们希望定义这样一种变量,它的值不能被改变。例如,用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区大小不再合适时,很容易对其进行调整。另一方面,也应随时警惕防止程序一不小心改变了这个值。
引用 引用为对象起了另外一个名字,引用类型引用另外一个类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名: int ival=1024; int &refval=ival; //refval指向ival(是ival的另一个名字) int &refval2; //报错:引用必须初始化 一般在初始化变量的时,初始值会被拷贝到新建的对象中。
初始值 当对象在创建的时候获得了一个特定的值,我们说这个对象被初始化了。 注意:初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。 1 列表初始化 C++语言定义了初始化的好几种不同的形式,这也是初始化问题复杂性的一个体现。
带符号和无符号类型 除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的和无符号的两种。带符号类型可以表示正数、负数和0,无符号类型则仅能表示大于等于0的值。 类型int、short、long和long long都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,例如unsigned long。
点运算符(.):点运算符只能用于类类型的对象,其左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名,运算结果为右侧运算对象指定的成员。 调用运算符(()):当用点运算符访问一个成员函数时,通常我们是想调用该函数,我们使用调用运算符来调用一个函数,调用运算符是一对圆括号,里面放置实参(argument)列表(可能为空)。
Sales_item.h #ifndef SALES_ITEM_H #define SALES_ITEM_H #include #include using namespace std; class Sales_item { friend ostream& opera...
Setting->Compiler 直接在“Have g++ follow the C++11 ISO C++ language standard [-std=c++11]” 选项上打勾 保存就可以了
上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题。++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又是完全不同的(q前置运算符:先加1,再赋值;后置运算符:先赋值,再加1)。
在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的。这一系列我将主要讲解C++中有关运算符重载方面的内容。在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解。
重载限制 多数C++运算符都可以用下面的方式重载。重载的运算符不必是成员函数,但必须至少有一个操作数是用户自定义的类型。下面详细介绍C++对用户定义的运算符重载的限制。 1 重载后的运算符必须至少有一个操作数是用户自定义的类型,这将防止用户为标准类型重载运算符。
C++的流插入运算符“”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream。cin和cout分别是istream类和ostream类的对象。在类库提供的头文件中已经对“”进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据。
最近自己正好要使用codeblocks编写C++程序,安装好却发现无法编译,如果您也遇到相似问题,可以参考本文. 如果您已安装codeblocks,想转换成中文界面,直接参考Step 2. 如果您C程序无法编译,直接参考Step 3.
#include using namespace std; void count() { int value; int cnt; int curvalue; if(cin>>curvalue) { cnt=1; ...