C++ Primer Plus读书笔记03

2012-02-24

1、 结构体的默认访问权限是public,类是private

∴ class myClass{

void setValue(int value);}            //不声明,则为private权限

2、 类声明于myclass.h中,类实现于myclass.cpp中(include”myclass.h”)

void myclass::setValue(int value){…}

3、 快速string ,double转换

#include<sstream>

string doubleToString(double value)

{ostringstream ostr;      ostr<<value;  return ostr.str()           }

double stringToDouble(string instring)

{double temp;              istringstream  istr(instring);      istr>>temp;         return temp;}

4、 this指针

(1)  this.value=value;

(2)  通过this可以从对象的方法中调用一个函数或方法,此函数的参数为对象指针

eg. void printall(myclass *p){…;}

若在myclass类的一个方法中调用printall,可用printall(this)

5、创建对象

创建对象

无构造函数时

有构造函数时

在栈上

myclass test;

test.setValue(6);

若包含构造函数,只可在初始化时创建

myclass test(2)//唯一正确

在堆上

myclass *temp=new myclass();

test->setValue(6);

delete test;

myclass *test;

test=new myclass(2);

6、初始化列表允许在创建数据成员的同时完成初始化

myclass::myclass():mValue(10),mString(“”)//构造函数处初始化

{

}//数据成员按照类定义的顺序初始化,而非在本处的顺序,另外,const数据成员、引用数据成员、没有默认构造函数的对象数据成员必须在此处初始化

7      c++中函数默认为按值传递,所以函数参数只是变量的一个副本,而不是变量本身

例如test.setString(name);

void myclass::setString(string input){…}//会调用input的构造函数并撤销input,而name一直未变

∴按const引用传递可以有效提高效率,避免创造副本及调用构造、析构函数

8、

如果定义了

可以创建

无构造函数

myclass a;   myclass b(a);

仅一个0参构造函数

myclass a;   myclass b(a);

仅一个复制构造函数

不能创建对象

仅一个单参或多参构造函数

myclass a(5);  myclass b(a);

1个0参,1个单参或多参

myclass a;  myclass b(5);  myclass c(b);

 

9、 栈中的对象按照声明的逆序撤销(一个代码块内),堆中的对象不会自动撤销,须用delete调用析构函数

10、         复制只有初始化时才出现,否则叫赋值

myclass test2=test1;    //复制,调用复制构造函数

myclass test3;

test3=test;      //赋值

 

myclass::myclass(myclass test2):value(myclass2.value){}

与myclass::myclass(myclass test2)

{value=test2.value;}区别

前者是复制,后者是赋值;在初始化列表中不包含某数据成员时,编译器对其完成默认初始化。所以const型只可用前者,因为初始化后不可更改。

11、         c++中二维数组arr[m][n]

int **arr;

arr= new int *[m];

for(i=0;i<m;i++)     arr[m]=new int [n];

12、         只要类会动态分配内存,就要编写析构函数、复制构造函数和赋值运算符。默认的复制构造函数和赋值运算符都是浅复制,会出问题

 

posted on 2012-04-06 17:37  TheBest  阅读(152)  评论(0编辑  收藏  举报

导航