现在的位置: 首页 > 综合 > 正文

c++小知识点

2018年01月22日 ⁄ 综合 ⁄ 共 2085字 ⁄ 字号 评论关闭
文章目录

char*和c风格字符串

1.
char * stb="aa"; 这样的stb本身就是一个常量,等价于const char*,不能修改其值的内容。
 

    所以执行stb[0]='b',会出现崩溃。

    可以char stb[20];
   strcpy(stb,"aa");

2. c风格字符串(以null结束的字符串)的标准库函数

    strlen(s)

    strcmp(sl,s2)

    strcat(s1,s2)    strcpy(s1,s2)

    strncat(s1,s2,n) strncpy(s1,s2,n)

  3. 调用strcat 和strcpy时,必须确保目标字符串具有足够的大小。如果必须使用c风格字符串,则使用strncat和strncpy比strcat和strcpy更安全。

  4. 应该尽量避免使用c风格字符串,尽量使用标准库类型string,增强了安全性和效率,不用担心修改字符时涉及到的大小问题。

函数中的static

 static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化。这种对象一经被创建,在程序结束前都不会被撤销。

类的整型(int char bool)const static 变量

如果类的成员变量是整型const static类型,并且初始化式是一个变量表达式,就可以再类的定义体中对该该变量进行初始化化。用常量值初始化的整型const static数据成员是一个常量表达式,它可以用在任意需要常量表达式的地方。
const static 数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义。在类内部提供初始化式(虽然进行了初始化,再并未定义)时,成员的定义不可以在指定初始值。

const 成员函数

1. const 对象只能使用const 成员函数。非const对象可以使用const成员函数或非const成员函数,但非const版本是一个更好的匹配。
2. 在普通的非const成员函数中,this的类型是一个执行类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的对象,也不能改变this所保存的地址。
3. 基于成员函数是否为const,可以重载一个成员函数。即可以在类中既可以定义成员函数为const,也可以定义为非const成员函数。当一个类既定义了const成员函数,又定义了非const成员函数,当我们定义一个非const对象时,则该对象优先调用非const成员函数。只有未定义非const成员函数时,才调用const成员函数。
4. const成员函数不能修改对象的成员函数,只限于对象的non-static成员变量,却可以修改类的static成员变量。如果const成员函数想修改对象的non-static成员变量,需要将关键字mutable放在成员变量声明之前:
class Screen{
private:
    mutable size_t access_ctr;
}
关于const成员函数可以修改类的static成员变量的解释:
对象在调用成员函数时,都会在自己的形参表中加一个参数:这个参数是指向函数所在类的类型的CONST指针.比如:
class A
{
 private:
  int n;
 public:
  void set()
  {
    n=10;  
  };
};
上边的set函数,是给n赋值的,但是它怎么知道是给哪一个对象的n赋值呢?这就需要在参数中告诉它。编译器为我们作了这些工作。实际生成的set函数可以理解成这样的:
public A::set(A* const this)
{
  this-〉n=10;
}
而我们调用的时候其实是这样的:
A a;
A::set(&a);
如果是const成员函数,编译器所作的这项工作也会改变。它会生成一个指向cosnt对象的const指针。所以你不能通过this来改变它所指向的对象。但是要知道static对象并不需要this指针来改变,所以它和const函数是没关系的。

const指针与STL迭代器

1. const指针
    声明迭代器为const就像声明指针为const一样(即声明一个T* const指针)
例子:
 std::vector<int> vec;
 const std::vector<int>::iterator iter=vec.begin();
2. 指针指向的对象为const
   如果你希望迭代器所指的东西不可被改动(即希望STL模拟一个const T*指针),你需要的是const_iterator
例子:
std::vector<int> vec;
std::vector<int>;;const_iterator cIter=vec.begin();

函数返回值做左值

函数返回值分为:值,引用,指针三种。引用是c没有而c++有的,并且因为引用是左值实现了运算符连续运算的基础;而值不可以做左值;当返回指针时,间接引用指针指向的数值,这时函数返回值同样也可以做左值。


 
 

抱歉!评论已关闭.