date: 2017-03-13 21:00:05
class相关易错点
- 类中的静态数据成员
C++primer:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联。
class Person {
public:
static int getNumberOfObjects();
private:
static int numberOfObjects;
};
int Person::numberOfObjects=0;
2. 有且只有const int型的static变量能在类中初始化。如:
class Person
{
private:
static const int age=20;
static string address;
//这一个就不能在类中初始化,他不是static const int
public:
};
3. 静态数据成员的特点
* 对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。
* 因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。
* 静态数据成员主要用在各个对象都有相同的某项属性的时候。
* 同全局变量相比,使用静态数据成员有两个优势:
1.静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性。
2.可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能。
- 类中的静态成员函数
- 静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。
- 它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。如果强行调用,编译器会发出“error: cannot call member function”
- 非静态成员函数可以任意地访问静态成员函数和静态数据成员。
getline的作用与使用
- 作用:从输入流中读入一行字符,并将缓冲区的\n抹去
- 使用:现阶段简易使用:
string str;
getline(cin,str);
即可
几个之前没见过的编译错误
-
error: stray '\xxx' in program
代表程序中有不少比较奇奇怪怪的低级错误,例如中文括号,中文分号等中文字符。 -
error: 'string' in namespace 'std' does not name a type
代表无法识别string是什么,需要include<string> -
collect2: error: ld returned 1 exit status
最可能的是声明了函数却未定义,或者class中的静态数据成员未在class外定义 -
undefined reference
也很可能是声明未定义问题,注意所指函数在哪个库中。
-
"<<": 没有找到接受"std::string"类型的右操作数的运算符(或没有可接受的转换)
在实现函数的cpp文件中也要记得#include<string>
网友评论