Resumen de opiniones C ++ (c) - Función

Trate de usar referencia constante

La función no cambia el parámetro definido como referencias comunes es un error común, que no sólo traerá una llamada a la función engañosa que la función se puede modificar el valor de su argumento, y también puede causar errores menos graves .

int get_size(string& s)
{
	return s.size();
}

Este parámetro es referencias de las funciones comunes y de referencia constante, por tanto, inaceptable, ya que en C ++, es la cadena const char * literal tipo, intentar inicializar la variable de referencia s por la referencia const constante sería ilegal. Por ejemplo, la siguiente llamada ilegal.

get_size("abc");  // 非法

principales opciones de línea de comandos de procesamiento

Cuando se utiliza el argumento argv, hay que recordar los argumentos opcionales de argv [1] Inicio; Nombre argv [0] almacenar el programa, en lugar de la entrada del usuario.

// 调用prog -d -o ofile data0
int main(int argc, char* argv)
{
	// argc = 5;
	// argv[0] == "prog";
	// argv[1] == "-d";
	// argv[2] == "-o";
	// argv[3] == "ofile";
	// argv[4] == "data0";
	// argv[5] == 0;
}

Caso de un valor de retorno de la función como el valor de la izquierda

Cuando la función devuelve un tipo de valor es un tipo de referencia, obtenida cuando las llamadas se dejaron valor, y el resto de casos son los valores correctos.

int& get_A_i(int* A, int index)
{
	return A[index];
}
int main()
{
	int A[10];
	get_A_i(A, 1) = 1; // 等价于A[1] = 1;
}

no está obligado a devolver una referencia a una variable local de atención, excepto la variable local estática modificado, ya que tiene un ciclo de vida particular.

int &get_i()
{
	static int i = 243;
	return i;
}

int main()
{
	get_i() = 1; // 执行完毕后i=1;
}

Declarar un puntero a una función devuelve una matriz

int(*func(int i))[10];

Es capaz de comprender el significado de la declaración prevista en el camino desde el interior hacia fuera:

  1. Representante func declaración (int i) con un int es una función del parámetro, el nombre de la función func.
  2. (* Func (int i)) representante del valor de retorno es un tipo de puntero.
  3. (* Func (int i)) [10] es representativa de un puntero a una matriz de longitud 10.
  4. int (* func (int i)) Tipo [10] representa los elementos de la matriz es un int.

En C ++, podemos utilizar el extremo 11 opuesto del tipo de retorno, por lo que la declaración anterior más fácil de entender:

auto func(int i) -> int(*)[10];

El tipo de retorno en el -> puntero después, se puede hacer la declaración más fácil de entender.

La sobrecarga y el parámetro const

A medida que la const de nivel superior es ningún requisito en el momento de la asignación, por ejemplo, es posible tipo de asignación int const int tipo, a su vez, también está disponible. Así que tenemos un parámetro de primera const y no podemos ser una sin la capa superior de la distinción parámetro const:

int func(int i);
int func(const int i);

int func2(int *p);
int func2(int *const p);

Y dos declaraciones aquí func func2 son equivalentes. Pero la const subyacente, se puede distinguir, por ejemplo:

int func(int &i1);
int func(const int &i2);

int func2(int *p1);
int func2(const int *p2);

En este momento, i2 y p2 son const inferior const, ya que no es libremente cambiar entre la const subyacente, tal como el tipo const int & i2 no initialize tipo int & i1, i1 puede iniciar mientras i2, pero hay una manera de seleccionar un compilador Partido función superior, por lo que esta es una forma legítima de sobrecarga.

Acerca de los parámetros por defecto

Las variables locales no pueden funcionar como valores por defecto, además. Mientras el tipo de la expresión se puede convertir en el tipo deseado de parámetros de moldeo, que puede servir como una expresión argumento predeterminado. Por ejemplo:

int wd = 80;
char def = ' ';
int func() { return 0; }

string screen(int a = wd, char b = def, int c = func())
{
	return "";
}

int main()
{
	screen(); //相当于screen(wd,def,func())
	def = '*';
	int wd = 70; // 隐藏外层wd
	screen(); // 虽然wd被隐藏,但是局部变量wd与函数的默认参数没有任何关系,所以该语句等价于screen(80,'*',func());
}

De particular interés es el ejemplo de la segunda pantalla (), aunque la definición de una variable local wd wd oculta exterior, pero las variables y funciones locales wd argumento predeterminado no tiene nada que hacer, por lo que el valor del parámetro por defecto sigue siendo un 80 wd .

depuración Ayuda

C ++ define compilador __func__ variable cuyo valor es el nombre de la función de depuración actual. Además, el preprocesador define cuatro útil para depurar nombre:

  • __FILE__Almacenar el nombre del archivo de cadenas literales.
  • __LINE__almacenamiento de plástico números de línea literales actuales.
  • __TIME__el almacenamiento de archivos compilan los literales de cadena de tiempo.
  • __DATE__el almacenamiento de archivos compilados literal cadena de fecha.
int main()
{
	cerr << "Error: " << __FILE__
		<< " : in function " << __func__
		<< " at line " << __LINE__ << endl;
}

Lo anterior salida de código:

Error: c:\users\Prosat\source\repos\solution\solution\main.cpp : in function main at line 217

Se puede observar que los consejos del compilador que estas variables hemos utilizado el código incorrecto.

puntero de función

La definición, misiones y utilizar el
ejemplo, tengo una función como esta:

bool lengthCompare(const string &s1, const string &s2)
{
	return s1.size() > s2.size();
}

Para definir una correspondiente necesidad puntero de función para asegurarse de que el tipo de retorno y la lista de parámetros una coincidencia exacta (se pueden convertir el uno al otro qué no funciona), para funciones sobrecargadas, debo indicar la función de llamada.

	// pf指向一个函数,返回值是bool,形参是const string &s1, const string &s2。
	bool(*pf)(const string &s1, const string &s2); // 未初始化
    // 赋值
	pf = lengthCompare; // 合法,会自动将lengthCompare的地址赋值给pf。
	pf = &lengthCompare; // 等价于上面的语句
    // 调用
    bool b1 = pf("hello", "goodbye");
	bool b2 = (*pf)("hello", "goodbye"); // (*pf)括号不能少,否则含义不同。

Volver puntero a una función

int(*f3(int i))(int *a, int b);

Del mismo modo, entendemos el uso de la declaración de dentro hacia fuera la forma en significados:

  1. f3 Representante (int i) es una función declarada con un parámetro int, el nombre de la función F3.
  2. (* Func (int i)) representante del valor de retorno es un tipo de puntero.
  3. int (* func (int i)) (int * a, int b) es representativa de un puntero a un parámetro de (int * a, int b) devuelve la función del valor de int.

El dedo meñique corresponde a la declaración de tipo de retorno:

auto f3(int i) -> int(*)(int *a, int b);

sentimiento personal de cola realmente el tipo de retorno es más fácil de entender, se ve muy claro.

Publicado seis artículos originales · ganado elogios 0 · Vistas 89

Supongo que te gusta

Origin blog.csdn.net/qq_33584870/article/details/104693434
Recomendado
Clasificación