C++需要注意的地方

1、当一个函数返回引用时,实际返回了一个变量的内存地址
2、setw(只对其紧跟的起作用)
3、setw setfill(’+’)
4、setprecision()
5、setprecision() setiosflags(ios::fixed)//小数点右边有几位小数;
6、setiosflags(ios::showpos)//强制显示符号;
7、setiosflags(ios::showbase)
8、setiosflags(ios::scientific)
9、setiosflags(ios::showpoint)
10、Point::setPoint(double,double)方法:设置Point对象的x坐标(第一个参数)和y坐标(第二个参数)并返回本对象,一定要注意返回类型为Point &也就是类名 &,在函数体中,返回一个地址即* this
11、int getData()const 是指这是个常量函数只能被常量对象(即常量函数等)访问。
12、常量成员函数中不能调用非常量成员函数;
13、派生类中的虚类要保持其虚特性,必须基类虚函数与函数原型完全相同(即要求每个形参的类型相同,函数返回类型也要相同),否则就是普通的函数重载,与基类的虚函数无关。
14、判断地址是否相同的方法
bool operator==(const Array& p)
{ if(this==&p)
return true;
}
15、在用了动态分配的时候千万别忘记删除动态分配区域
~Array(){if(mems!=NULL)delete []mems;}
16、
int& operator[](int i)//只要没有返回一个临时变量,最好是都加上&符号;
{
return ar[i];
}
17、重载[]的时候返回类型必须是&类,因为要cin,必须得返回引用,输出无所谓,输入必须引用,输出最好也引用。
18、在friend ostream& operator<<(ostream& os,const Time& p)这里,必须要写const原因如下:
(1)const作为形参时,既可以传递引用,又可以传递常量,但不加const只能传递引用。
(2)++t和-–t返回的均为自身引用,但是-–t和++t返回的非引用,返回的是常量。
意思就是如果一个常量返回的是引用的话,可以不加const,但是如果返回的不是引用的话必须加const
cout输出的是引用
19、+=是…=…+…的意思,所以在重载+=的运算符的时候要返回的形式也是…=…+…的形式,而不能直接返回…+…
20、const int getData()是指这个函数的返回值是个常量,只能使用他(这个返回值)不能改变它。
int getData()const 是指这是个常量函数只能被常量对象(即常量函数等)访问。
21、到底何时调用拷贝构造函数呢?
{X p2=p1;}
Point p2(p1);//这里会调用拷贝构造函数;
Line(Point &p):p1§{}//这里调用了拷贝构造函数,前面没有调用拷贝构造函数,但是后面p1§这里调用了拷贝构造函数;
Point p2(p1);//这里会调用拷贝构造函数;
void f(X p){}//这里是传值参数,所以调用拷贝构造函数;
22、矩阵相乘的模板

void matrixMultiply(T **a, T **b, T **c, int n,int p)  
{  
    for (int i = 0; i < m; i++)  //a的行数
    {  
        for (int j = 0; j < p; j++)  //b的列数
        {  
            int sum=0;//在这里指明sum=0;
            for (int k = 0; k < n; k++)  //a的列数  //b的行数
            {  
                sum += a[i][k] * b[k][j];  //注意这里是乘号;
            }  
            m[i][j] = sum;  
        }  
    }  
}  

23、T * a;那么a代表起始地址,如果l是a的长度的话,那么a+l代表最终地址;
24、Vector T;那么,T代表的是地址;
25、当一个函数有重载的时候,最好不要使用默认构造参数;
26、静态成员
(1)静态成员的命名和赋值;
static int sum;
类型 类名::静态成员名=初始值;
(2)静态成员访问
静态成员被被定义为公有成员的时候,在类外有以下形式
通过类名访问(用下面的方法访问的时候,函数名前面必须要写上static)
类名::静态数据成员名;
类名::静态成员函数名(参数列表);
这种使用方法是非静态成员没有的
上述方法是最常见并且最好使用上述方法,这样可以和普通的函数区别开
27、如果要是想给一个对象一个编号的话,就要采用静态成员赋给一个常量的方法
28、封闭类中赋值

class Computer
{
private:
    CPU p1;
    Memory p2;
    string name;
public:
Computer(CPU cpu,Memory me,string na):p1(cpu),p2(me),name(na){}//这里会调用拷贝构造函数,而且,在Computer构造函数中,定义的是CPU,而不是int p1;(CPU中的成员函数)

29、在封闭类中赋值的时候,一定是给封闭类中的类名赋值,如Base p1(Base类中的对象为int类型),那么就给p1赋值,至于在封闭类中如何定义函数有两种类型,一种是Derived(int a):p1(a);另外一种是Derived(Base p):p1§,至于选哪一种方式,则具体看main函数中是什么样子的。
在多态和继承中,则只能是Derived(int a):Base(a),而且,必须给封闭类中的类赋值;
30、File到new到project
少了东西从view中找
31、用了动态分配new的时候,千万别忘记delete掉,有时候delete和输出也有先后顺序,要记住先顺序;
32、一般Line(Point &p,Point &q):p1§,p2(q){++sum;++no;}和后面这里都需要加引用符号Line(Line&p):p1(p.p1),p2(p.p2){++sum;++no;}
33、计数Line类和计数Point类
在计数数字的时候,上下都可以是sum和now,因为类内定义的变量只属于这个类,虽然它是静态变量,存在全局数据区,但还是只归它所属的类。因此上面的sum和now只计数上面的类数目,下面的sum和now只计数下面的类数目,虽然名称相同,但是计数的个数和类型是不同的;
34、看各种运算符重载的格式
35、对于引号的输出方法如下cout<<“A student whose name is “<<”\“”<<names<<"\”"<<" and id is “<<id<<” is erased!"<<endl;对于英文的"可以采用’”’的方法输出,但是对于中文的“”则需要采用""“的方法,输出,其实不管是中文的还是英文的最好多采用这样的方法输出即”""
36、学会使用动态分配
方法一:

Person(const Person& p):age(p.age)
    {
        name=new char[strlen(p.name)*2];//这里前万别忘记*2或者+1;
        strcpy(name,p.name);
        cout<<"A person whose name is "<<'"'<<name<<'"'<<" and age is "<<age<<" is cloned!"<<endl;
}

方法二:

for(int i=0;i<strlen(p.name);i++)
{
    name[i]=p.name[i];
}name[strlen(p.name)]=0;
或者name[strlen(p.name)]='\0';//千万不要忘记写‘\0’;注意斜杠的方向

37、注意delete数据的时候,要看清楚在哪里delete,一般先输出,然后再delete掉。
也就是~Person(){cout<<"A person whose name is \""<<name<<"\""<<" and age is "<<age<<" is erased!"<<endl;delete[]name;}
千万不要先delete []name,这样的话,输出会出现错误;
38、如果对象是char* 或者int* 啥的话,就必须要带length,但是,vector等容器中自带length,不需要带着length;
39、strlen最好不要放在循环里,因为它的执行时间很长,最好把它赋给一个数len,用len代替它
40、

class Expression
{private:
      int a,b;
      char c;public:
    Expression():a(0),b(0){}
    Expression(int aa,int bb,char cc):a(aa),b(bb),c(cc){}
};

char不需要赋初值;
41、Array::get(int n)方法:按格式从输入读取n元素。
封装一个整型数组类,用于存储整数和处理的相关功能
一个是不要忘记len,也就是长度,一个是不要忘记在get中给len赋值。
42、template
43、

Point* p=new Point(x,y);//注意这里赋值的方法,再一次做的时候,还是卡在这里;
        return *p;//返回的为一个内容,=而不应该为地址;
        //返回临时对象的时候在Point getCentroid()不能加引用;即Point& getCentroid()是错误的;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值